Tsql 通过删除输出时出现意外的行号行为

Tsql 通过删除输出时出现意外的行号行为,tsql,window-functions,Tsql,Window Functions,我希望[version]在#X中大于1,但似乎行数在进入#X时被重新评估。这是故意的行为吗?有什么方法可以防止吗 DROP TABLE IF EXISTS #T; CREATE TABLE #T (id INT, v CHAR(1)); INSERT INTO #T VALUES (1, 'a'), (1, 'b'), (2, 'a'), (2, 'b'), (2, 'c'); DROP TABLE IF EXISTS #X; SELECT TOP 0 *, 1 AS [version] INT

我希望
[version]
#X
中大于1,但似乎
行数
在进入
#X
时被重新评估。这是故意的行为吗?有什么方法可以防止吗

DROP TABLE IF EXISTS #T;
CREATE TABLE #T (id INT, v CHAR(1));
INSERT INTO #T VALUES (1, 'a'), (1, 'b'), (2, 'a'), (2, 'b'), (2, 'c');
DROP TABLE IF EXISTS #X;
SELECT TOP 0 *, 1 AS [version] INTO #X FROM #T;
DELETE t OUTPUT deleted.* INTO #X FROM (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY v) AS [version] FROM #T
) t WHERE t.[version] > 1;
SELECT * FROM #X;

如果有任何记录在案的行为,我会感到惊讶。我认为您不应该假设它将被重新评估或不会被重新评估。您可能应该在删除之前填充
#X
,而不是用输出填充它。在填充
#X
之前肯定会起作用,这会导致
#t
被扫描两次,考虑到我的实际表中的行数,这是一件坏事。有什么不对的,或者至少令人困惑的是,在delete中条件化的行是那些
[version]>1
的行,但是很多在
#X
中结束的行有
[version]=1
.a报告了类似的问题(缺少图像)。它是在现在已经不存在的“Connect”网站上作为一个bug提出的,后来被标记为已修复,但我们没有关于修复内容或版本的真实细节。许多迹象表明,在德纳利时间框架内(2012年),这一问题没有得到解决。你用的是什么版本?