Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server “如何”;受影响的n行“;在SQL Server中工作?_Sql Server - Fatal编程技术网

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