gpt4 book ai didi

sql-server - 使用CTE批量删除行时如何设置更改跟踪上下文?

转载 作者:行者123 更新时间:2023-12-02 20:19:03 24 4
gpt4 key购买 nike

我正在使用 SQL Server 2014,并且想要为某些删除 SQL 设置更改跟踪上下文。 DELETE SQL使用CTE小批量删除行以避免锁升级:

WITH cte_rows_to_delete (id) AS   
(
SELECT TOP 100 id
FROM TableA
)
DELETE FROM cte_rows_to_delete;

我可以在没有 CTE 的情况下为 DELETE 设置更改跟踪上下文:

DECLARE @dc varbinary(128) = CONVERT(VARBINARY(128), N'UseCaseA');
WITH CHANGE_TRACKING_CONTEXT (@dc) DELETE FROM TableA

但是当我把它们放在一起时,

DECLARE @dc varbinary(128) = CONVERT(VARBINARY(128), N'UseCaseA');

WITH CHANGE_TRACKING_CONTEXT (@dc)
WITH cte_rows_to_delete (id) AS
(
SELECT TOP 100 id
FROM TableA
)
DELETE FROM cte_rows_to_delete;

我收到一个错误

Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.

如果我在 CTE 前面添加 ;,SQL Server 只会提示

Incorrect syntax near ';'

我的问题是:SQL Server CTE 可以与更改跟踪上下文子句一起使用吗?我用谷歌搜索,但找不到任何有明确答案的文档。

谢谢

詹姆斯

最佳答案

令人费解的是,该语法没有记录它所适用的语句! WITH CHANGE_TRACKING_CONTEXT 有自己的主题,但这并没有解释它应该如何集成到所有语句中。

根据我的实验,您使用它的方式与在单个语句中声明多个 CTE 的方式大致相同:

WITH 
CHANGE_TRACKING_CONTEXT (@dc),
cte_rows_to_delete (id) as ( SELECT TOP 100 id from TableA)
DELETE FROM cte_rows_to_delete;

至少,这个语法在 SQL Server 2017 中没有给我带来错误;我还没有针对启用了更改跟踪的实际数据库对其进行测试。

值得注意的是,WITH 子句的顺序不是随意的:WITH CHANGE_TRACKING_CONTEXT 必须首先出现,然后是任何 XMLNAMESPACES 声明,然后是任何CTE。如果还有更多我不熟悉的 WITH,它们可能也有固定的顺序。

关于sql-server - 使用CTE批量删除行时如何设置更改跟踪上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51829232/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com