Sql server “如何”;受影响的n行“;在SQL Server中工作?
执行上述脚本以执行数据修补操作 等待它完成后,Sql server “如何”;受影响的n行“;在SQL Server中工作?,sql-server,Sql Server,执行上述脚本以执行数据修补操作 等待它完成后,NewColumn的一些值仍为空 NewColumn的计数为NULL为140,并且第二次执行相同的脚本。完成后,“n行受影响”的批次很少,如下所示: 当我检查NewColumn的计数为空时,它仍然是140。因此,我的最佳猜测是“n行受影响”是由于集合部分中的select查询造成的 为了进行实验,我专门针对一条记录运行了一次,并查看它如何与下面的查询一起工作 DECLARE @EndID BIGINT, @StartID BIGINT
NewColumn
的一些值仍为空
NewColumn的计数为NULL
为140,并且第二次执行相同的脚本。完成后,“n行受影响”的批次很少,如下所示:
当我检查NewColumn的计数为空时,它仍然是140。因此,我的最佳猜测是“n行受影响”是由于集合
部分中的select查询造成的
为了进行实验,我专门针对一条记录运行了一次,并查看它如何与下面的查询一起工作
DECLARE @EndID BIGINT,
@StartID BIGINT,
@n_batchSize INT = 3000
SET @EndID = (SELECT MAX(ID) FROM Table WHERE NewColumn IS NULL)
WHILE (@EndID>0)
BEGIN
SET @StartID = @EndID - @n_batchSize;
UPDATE Table WITH (ROWLOCK)
SET NewColumn =
(CASE
WHEN (ColumnA IS NOT NULL AND ColumnA > 0) THEN ColumnA
ELSE
(
SELECT TableC.ID
FROM TableB AS B WITH(NOLOCK)
INNER JOIN TableC AS C WITH(NOLOCK)
ON B.ID = C.ID
WHERE C.ID = Table.ID
) END
)
WHERE ID BETWEEN @StartID AND @EndID
AND NewColumn IS NULL
SET @EndID = @EndID - @n_batchSize;
WAITFOR DELAY '00:00:05'
END
结果如下:
根据结果,我的猜测似乎是错的。该语句不是由于子选择查询导致的?n受影响的行将来自您的更新查询。它显示更新了多少行。这不是因为子查询。这是因为更新查询正在根据where条件更新行
UPDATE Table WITH (ROWLOCK)
SET NewColumn =
(CASE
WHEN (ColumnA IS NOT NULL AND ColumnA > 0) THEN ColumnA
ELSE
(
SELECT TableC.ID
FROM TableB AS B WITH(NOLOCK)
INNER JOIN TableC AS C WITH(NOLOCK)
ON terminal.LocationID = location.LocationID
WHERE C.ID = Table.ID
) END
)
WHERE ID = 1 AND EntryZoneID IS NULL
无论我执行脚本多少次,NewColumn的计数都是空的
保持在140,当我手动计算受影响的n行时,它远远超过140。所以我不认为这是因为Where
部分也是这样。是的,额外的n行受影响
是由于表有一些复制操作,因此您的CASE
语句返回null
可能是因为翻倍的金额?UPDATE
语句仍将显示受影响的行数,即使它最终什么也不更改(即将null
列设置为null
),也可能是表中有一个触发器,这可能也会给你n行受影响的
消息。@DavidG:这意味着第一个0行受影响的
是由将空列设置为空的
引起的,第二个1行受影响的
是由触发器引起的?这意味着即使有0行受影响时触发器也会被触发
?也可能是另一种情况。触发器可以设置为在之前或之后运行。
WHERE ID BETWEEN @StartID AND @EndID
AND NewColumn IS NULL