不知道大家有没有遇到过类似UPSERT这个概念的T-SQL命令?使用选项 (1) 或 (2) 执行 INSERT|UPDATE 操作似乎过于复杂且容易出错。
客观的
确保所需的记录(在本例中为 employee_id 1)是最新的,而不必实质上编写相同的查询两次。
语境
选项
执行 SQL UPDATE... 检查 @@rowcount = 0 和 @@error = 0 ... 如果需要,执行 SQL INSERT
/sf/ask/77470221/ "Update using @@rowcount"
我在一家拥有直接 IT 安全方式的公司工作。我被聘为数据库分析师是为了优化我们团队中的一些流程。问题是我只有读写权限,我正在努力获得数据库的高级权限。目前我们在一台服务器上有很多数据库,我们只能在一个数据库上工作,我想知道是否BULK INSERT可以将权限授予单个数据库还是整个服务器的权限?
我已经通过网络搜索了这个,但我有点困惑。这是我发现的。为了使用 BULK INSERT,我应该拥有INSERT所需表或数据库的权限,并且ADMINISTER BULK OPERATIONS这是服务器范围的权限。如果我获得了ADMINISTER BULK OPERATIONS对整个数据库的INSERT权限和对单个数据库的权限,我是否只能BULK INSERT在该单个数据库中执行此操作,因为我没有INSERT对其他数据库的权限?
是否可以将使用限制为BULK INSERT具有多个数据库的服务器上的单个数据库?
对不起文字墙,谢谢!
假设我有表 A:BookingsPerPerson
Person_Id ArrivalDate DepartureDate
123456 2012-01-01 2012-01-04
213415 2012-01-02 2012-01-07
Run Code Online (Sandbox Code Playgroud)
我需要通过视图实现以下目标:
Person_Id ArrivalDate DepartureDate Jan-01 Jan-02 Jan-03 Jan-04 Jan-05 Jan-06 Jan-07
123456 2012-01-01 2012-01-04 1 1 1 1
213415 2012-01-02 2012-01-07 1 1 1 1 1 1
Run Code Online (Sandbox Code Playgroud)
该系统用于活动,因此每次酒店预订可能需要 1 到 15 天的时间,但不会超过此时间。任何想法将不胜感激。
我读到这ERROR_STATE()有助于区分源代码中可能发生相同类型错误的不同状态/位置。但我并不清楚它如何有用。
MSDN 指出:
ERROR_STATE()返回导致运行 TRY…CATCH 构造的 CATCH 块的错误的状态编号。
如何真正使用它?有人可以举个例子吗,这篇参考文章中提供的那些并不能真正帮助我很好地解释事情?
我对 SQL Server 很陌生,想了解以下非常简单的select语句是否需要任何锁。
Select * from Student;
Run Code Online (Sandbox Code Playgroud)
请考虑语句不会在begin tran块内运行的情况。
考虑到非聚簇索引是基于聚簇索引的,非聚簇索引是否有必要列出聚簇索引中包含的任何列?
换句话说,如果 Products 表包含 ProductID 上的聚集索引,那么在创建非聚集索引时建议包含 ProductID 列时,是否有必要将其添加为列?
如果没有,是否有将列名添加到非聚集索引的情况?
我有一个旧表,其名称包含不可打印的字符(CHAR(31),具体来说)。
不可打印的字符位于下划线旁边,我发现快捷方式CTRL+SHIFT+_创建了该CHAR(31)字符(这意味着“美国” - 单位分隔符)。以前的开发人员可能会错误地使用这个组合,并创建了包含这个奇怪字符的表格。
当我们SELECT对表发出命令时,它会返回结果。但是,当我们试图发出反对任何DDL( ,DROP,sp_rename等),字符会导致一个问题。
例子:
DROP TABLE Table_Name;
Run Code Online (Sandbox Code Playgroud)
提高:
消息 15225 - 在当前数据库 'MyDB' 中找不到名为 'Table_Name' 的项目,因为@itemtype 被输入为 '(null)'。
EXEC sp_rename N'Table_Name', N'NewTableName';
Run Code Online (Sandbox Code Playgroud)
提高:
消息 102 - '_Name' 附近的语法不正确。
我已经用正确的名称复制了表,并在相关对象上更正了它。剩下的步骤就是将它从数据库中删除。
只是一个见解:当我们从 SQL Server 复制+粘贴到 Notepad++ 时,它会在表名中间显示隐藏字符(“US”),在下划线旁边:
我需要备份 10-20 个大小在 10-50 GB 之间的 SQL Server 2008 R2 数据库,同时它们在线并由单个企业应用程序同时使用。我还需要将它们恢复到在所有数据库之间基本同步的状态(我可以承受数据库之间长达几秒钟的不同步)。目的是为 QA/DEV 环境捕获生产数据。
我强烈希望不要求数据库在完全恢复中运行,并提出一种备份方法,该方法专用于为 QA 环境捕获数据,并保持独立于不受我控制的主备份过程。
对于我的客户,捕获 20 个完整备份(每个约 30 GB)需要 1-2 小时。这使得按顺序进行完整备份是不可接受的,因为在简单恢复中运行时数据库会过于不同步。
我正在寻找比这些更好的想法:
想法 1:虚拟机磁盘的 SAN 级快照。从快照 xcopy MDF/LDF。
一旦复制的文件附加到不同的服务器实例,其恢复过程应该生成几乎同时快照的一致数据库。
谷歌搜索使我确信这是一个坏主意,至少因为我可能会与 master/msdb/etc 不同步。
IDEA 2:在所有数据库中编排复杂的备份和同步还原
这要求我要求以完全恢复运行的数据库,这是我不想要的。在截止日期 (T0) 之前为所有数据库启动并行备份。到达 T0 后,备份所有日志(最多需要几分钟)。获取由此产生的无数备份并尝试恢复它们并向前/向后滚动日志,以获得相对于 T0 的跨数据库某种程度的一致状态。
这需要大量的计划和脚本才能可靠地使用它,所以我会竭尽全力避免它。
PS1:我希望能够使用db snapshots。这个想法是在每个数据库上启动一个快照(应该在几秒钟内结束),然后在接下来的几分钟/几小时内按顺序完全备份每个。然后在不同的服务器上恢复所有这些并将每个恢复到快照。AFAIK 这种情况是不可能的,因为快照不能与数据库一起备份。它们只能在创建它们的服务器上就地回滚。此外,他们需要企业版,我没有为所有客户提供。
PS2:如果您知道能够生成跨数据库同步备份的 3rd 方解决方案,请提及它。
我遇到了大量阻止我的 SELECT 操作的 INSERT 的问题。
我有一张这样的表:
CREATE TABLE [InverterData](
[InverterID] [bigint] NOT NULL,
[TimeStamp] [datetime] NOT NULL,
[ValueA] [decimal](18, 2) NULL,
[ValueB] [decimal](18, 2) NULL
CONSTRAINT [PrimaryKey_e149e28f-5754-4229-be01-65fafeebce16] PRIMARY KEY CLUSTERED
(
[TimeStamp] DESC,
[InverterID] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF
, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON
, ALLOW_PAGE_LOCKS = ON)
)
Run Code Online (Sandbox Code Playgroud)
我还有这个小助手程序,它允许我使用 MERGE 命令插入或更新(冲突时更新):
CREATE PROCEDURE [InsertOrUpdateInverterData]
@InverterID bigint, @TimeStamp datetime
, @ValueA decimal(18,2), @ValueB decimal(18,2)
AS
BEGIN
MERGE [InverterData] AS TARGET
USING (VALUES (@InverterID, …Run Code Online (Sandbox Code Playgroud) 考虑这两个函数:
ROW_NUMBER() OVER (PARTITION BY A,B ORDER BY C)
ROW_NUMBER() OVER (PARTITION BY B,A ORDER BY C)
Run Code Online (Sandbox Code Playgroud)
据我了解,它们产生完全相同的结果。换句话说,您在PARTITION BY子句中列出列的顺序无关紧要。
如果有一个索引,(A,B,C)我希望优化器在两个变体中都使用这个索引。
但是,令人惊讶的是,优化器决定在第二个变体中进行额外的显式排序。
我在 SQL Server 2008 Standard 和 SQL Server 2014 Express 上见过它。
这是我用来重现它的完整脚本。
在 Microsoft SQL Server 2014 上试用 - 12.0.2000.8 (X64) 2014 年 2 月 20 日 20:04:26 版权所有 (c) Microsoft Corporation Express Edition(64 位),Windows NT 6.1(内部版本 7601:Service Pack 1)
和 Microsoft SQL Server 2014 (SP1-CU7) (KB3162659) - 12.0.4459.0 (X64) 2016 年 5 月 27 …
sql-server-2008 ×10
sql-server ×8
locking ×2
backup ×1
ddl ×1
pivot ×1
restore ×1
snapshot ×1
upsert ×1