小编usr*_*usr的帖子

在 SQL Server 查询中放置 ASSERT

作为MERGE我想运行的查询的一部分,我想在运行时断言某个条件成立。当MERGE找到 -match 时,我想更新某个列并执行以下逻辑:

  1. 如果目标列是NULL,则写入源值
  2. 如果目标是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)

这会可靠地工作吗?有理由不这样做吗?

sql-server sql-server-2014

7
推荐指数
1
解决办法
2679
查看次数

将 sysadmin 角色与 EXECUTE AS 结合使用

我的理解是,我可以将该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)

security sql-server dbcc role

7
推荐指数
2
解决办法
1万
查看次数

HT* 等待类型是什么意思?(HTREPARTITION, HTDELETE, ...)

一个大查询正在运行。溢出到磁盘的批处理模式散列连接的结果使用 流式传输到临时表中select into。该查询显示等待类型HTDELETEHTREPARTITION偶然。查询未使用列存储索引。

我很确定这些等待类型对于溢出到磁盘的批处理模式散列连接来说是正常的。出于好奇,我试图了解这些等待类型的含义。也许这种洞察力可以帮助优化查询或发现问题。那么这些等待类型是什么意思,在什么情况下它们是预期的呢?

没有列存储索引。我正在使用该left join ZeroRowCsTable on 0=1技巧为行模式表启用批处理模式。

sql-server sql-server-2014 batch-mode

7
推荐指数
1
解决办法
1687
查看次数

批处理文件中 SQL Server 数据库的脚本内容

我希望能够从 Windows 命令提示符将给定数据库的架构脚本写入 .sql 文件。基本上,我想以编程方式执行 Management Studio 的“生成脚本”功能。

我知道使用 .NET 和 SMO 可以做到这一点,但是是否有内置的东西可以做到这一点?

这个问题的背景:这是一个简单的审计工具。我们希望每晚都捕获模式。任何原始的、低技术的解决方案都适合我们。

sql-server command-line scripting smo

6
推荐指数
2
解决办法
6598
查看次数

比较二进制 0x 和 0x00 结果在 SQL Server 上相等

似乎 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。我也想找到一个更简单的解决方案。

sql-server sql-server-2012 varbinary

6
推荐指数
1
解决办法
9588
查看次数

在 SQL Server 中查询差异变化图

差异备份使用差异更改映射页面来确定要备份的页面。我想研究一种涉及差异备份的备份策略。为此,我想自动跟踪多个数据库随时间变化的数据量。

我想以编程方式查询差异更改映射以确定更改了多少页。

DBCC PAGE根据http://www.practicalsqldba.com/2013/07/sql-server-understanding-differential.html这似乎是可能的。有没有比这更清洁或“记录更多”的方式?看起来这在实施时会很笨拙且容易出错。

sql-server sql-server-2012

6
推荐指数
1
解决办法
445
查看次数

带有 ROW_NUMBER 的 DELETE 的奇怪查询结果

在以下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 sql-server-2014

6
推荐指数
1
解决办法
2647
查看次数

在这种奇怪的 SQL Server 镜像情况下会发生什么?

假设两个 SQL Server 实例(S1 和 S2)处于同步镜像或同步可用性组中。现在发生以下情况:

  1. 写入发生在 S1 上,事务提交由客户端发起
  2. 写入已在 S2 上硬化(但尚未在 S1 上硬化
  3. S1 掉电,提交日志记录永不写入
  4. S2 断电(交易已经硬化)
  5. S1 启动并撤消事务
  6. S2启动并保持交易

现在 S2 更进一步了!它有一个 S1 没有的写操作。两个复制品已经分道扬镳。

在这种情况下会发生什么?当更多写入到达 S1 并将 S1 带入与 S2 不兼容的历史时会发生什么?写历史看起来像一个叉子。

sql-server mirroring availability-groups

6
推荐指数
2
解决办法
2811
查看次数

为什么 Columnstore 索引构建经常等待 SLEEP_TASK?

我现在正在构建一个列存储索引。输出sp_whoisactive

在此处输入图片说明

这是一个开发机器。没有其他东西在运行。服务器有 8GB 可用内存。CPU 几乎空闲。构建似乎处于全局字典采样阶段,因为sqlservr.exe它正在执行随机磁盘 IO 并且几乎不写入任何内容。

这是否SLEEP_TASK表明我可以采取措施使索引构建速度更快?为什么构建有时会“休眠”?

这是 SQL Server 2014 SP1。

sql-server sql-server-2014

6
推荐指数
1
解决办法
492
查看次数

使用并行 SELECT INTO 所需的最低兼容性级别是多少?

SELECT INTO在 SQL Server 2014 中使用并行所需的最低兼容性级别是多少?

sql-server parallelism sql-server-2014

5
推荐指数
1
解决办法
285
查看次数