作为MERGE我想运行的查询的一部分,我想在运行时断言某个条件成立。当MERGE找到 -match 时,我想更新某个列并执行以下逻辑:
NULL,则写入源值NOT NULL,则断言目标和源是相同的我希望这两个值在情况 2 中总是相同的,但我可能犯了一个错误(有一个错误)。发生这种情况时,我想使语句崩溃并让我的应用报告错误。这是一种非常罕见的错误情况,通常处理过程中不会发生这种情况。
所以我在想我可以滥用被零除的异常来触发崩溃:
MERGE
...
WHEN MATCHED BY TARGET THEN UPDATE SET
TargetCol = CASE
WHEN TargetCol IS NULL THEN SourceCol
WHEN TargetCol = SourceCol THEN SourceCol
ELSE 0/0 END --crash!
Run Code Online (Sandbox Code Playgroud)
这会可靠地工作吗?有理由不这样做吗?
我的理解是,我可以将该EXECUTE AS OWNER子句用作我创建的过程的一部分,以使该过程的主体以不同的用户身份运行。我的目标是执行需要sysadmin角色 ( DBCC TRACEON(1224))的命令。此过程应该由非特权用户调用。
我在sa用户下运行了以下脚本:
SELECT USER_NAME(), USER_ID(), IsSysAdmin = IS_SRVROLEMEMBER('sysadmin')
-- dbo 1 1
IF EXISTS(SELECT * FROM sys.procedures WHERE name = 'MyProc')
DROP PROCEDURE MyProc
GO
CREATE PROCEDURE MyProc
WITH EXECUTE AS OWNER
AS
SELECT USER_NAME(), USER_ID(), IsSysAdmin = IS_SRVROLEMEMBER('sysadmin');
-- dbo 1 0
DBCC TRACEON(1224)
--Msg 2571, Level 14, State 3, Procedure MyProc, Line 7
--User 'dbo' does not have permission to run DBCC TRACEON.
RETURN
GO
EXEC …Run Code Online (Sandbox Code Playgroud) 一个大查询正在运行。溢出到磁盘的批处理模式散列连接的结果使用 流式传输到临时表中select into。该查询显示等待类型HTDELETE和HTREPARTITION偶然。查询未使用列存储索引。
我很确定这些等待类型对于溢出到磁盘的批处理模式散列连接来说是正常的。出于好奇,我试图了解这些等待类型的含义。也许这种洞察力可以帮助优化查询或发现问题。那么这些等待类型是什么意思,在什么情况下它们是预期的呢?
没有列存储索引。我正在使用该left join ZeroRowCsTable on 0=1技巧为行模式表启用批处理模式。
我希望能够从 Windows 命令提示符将给定数据库的架构脚本写入 .sql 文件。基本上,我想以编程方式执行 Management Studio 的“生成脚本”功能。
我知道使用 .NET 和 SMO 可以做到这一点,但是是否有内置的东西可以做到这一点?
这个问题的背景:这是一个简单的审计工具。我们希望每晚都捕获模式。任何原始的、低技术的解决方案都适合我们。
似乎 SQL Server 认为 0x 和 0x00 相等:
SELECT CASE WHEN 0x = 0x00 THEN 1 ELSE 0 END
Run Code Online (Sandbox Code Playgroud)
这输出1.
如何获得真正的二进制位对位比较行为?另外,两个值被认为相等的确切规则(var)binary是什么?
还要注意以下行为:
--prints just one of the values
SELECT DISTINCT [Data]
FROM (VALUES (0x), (0x00), (0x0000)) x([Data])
--prints the obvious length values 1, 2 and 3
SELECT DATALENGTH([Data]) AS [DATALENGTH], LEN([Data]) AS [LEN]
FROM (VALUES (0x), (0x00), (0x0000)) x([Data])
Run Code Online (Sandbox Code Playgroud)
问题的背景是我正在尝试对二进制数据进行重复数据删除。我需要GROUP BY二进制数据,而不仅仅是比较两个值。我很高兴我什至注意到了这个问题。
请注意,它HASHBYTES不支持 LOB。我也想找到一个更简单的解决方案。
差异备份使用差异更改映射页面来确定要备份的页面。我想研究一种涉及差异备份的备份策略。为此,我想自动跟踪多个数据库随时间变化的数据量。
我想以编程方式查询差异更改映射以确定更改了多少页。
DBCC PAGE根据http://www.practicalsqldba.com/2013/07/sql-server-understanding-differential.html这似乎是可能的。有没有比这更清洁或“记录更多”的方式?看起来这在实施时会很笨拙且容易出错。
在以下DELETE语句中,我尝试删除除按某些条件排序的第一行之外的所有行。(实际查询更有意义,这只是一个再现。所有的sys.objects东西都只是为了生成测试数据。)
注意过滤器r <> 1。然而,该OUTPUT子句输出带有r = 1. 怎么会这样?
USE tempdb
SET XACT_ABORT ON
BEGIN TRAN
SELECT *
INTO #o
FROM sys.objects
SELECT TOP 2 name FROM #o ORDER BY object_id --debug output
DELETE k
OUTPUT Deleted.name, Deleted.r
FROM (
SELECT k.*, ROW_NUMBER() OVER (ORDER BY object_id) r
FROM #o k
) k
WHERE r <> 1 --OUTPUT returns rows with (r = 1)
SELECT TOP 2 name FROM #o ORDER BY …Run Code Online (Sandbox Code Playgroud) 假设两个 SQL Server 实例(S1 和 S2)处于同步镜像或同步可用性组中。现在发生以下情况:
现在 S2 更进一步了!它有一个 S1 没有的写操作。两个复制品已经分道扬镳。
在这种情况下会发生什么?当更多写入到达 S1 并将 S1 带入与 S2 不兼容的历史时会发生什么?写历史看起来像一个叉子。
我现在正在构建一个列存储索引。输出sp_whoisactive:

这是一个开发机器。没有其他东西在运行。服务器有 8GB 可用内存。CPU 几乎空闲。构建似乎处于全局字典采样阶段,因为sqlservr.exe它正在执行随机磁盘 IO 并且几乎不写入任何内容。
这是否SLEEP_TASK表明我可以采取措施使索引构建速度更快?为什么构建有时会“休眠”?
这是 SQL Server 2014 SP1。
SELECT INTO在 SQL Server 2014 中使用并行所需的最低兼容性级别是多少?
sql-server ×10
batch-mode ×1
command-line ×1
dbcc ×1
mirroring ×1
parallelism ×1
role ×1
scripting ×1
security ×1
smo ×1
varbinary ×1