Как работает «n строк» ​​на SQL Server?

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 

Вышеупомянутый скрипт был выполнен для выполнения операции паттинга данных.

После того, как он был завершен, некоторые значения NewColumn остались пустыми.

NewColumn IS NULL равен 140 и тот же скрипт выполняется во второй раз. По завершении, несколько партий с «n строк затронуты», как показано ниже:

введите описание изображения здесь

И когда я проверяю кол-во NewColumn IS NULL , он все равно равен 140. Так что я лучше всего предполагаю, что «n строк затронуты» вызвано запросом select из части SET .

Чтобы выполнить эксперимент, я выполнил определенную ориентацию на одну запись и посмотрел, как она работает с приведенным ниже запросом

 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 

Результат следующий:

введите описание изображения здесь

Основываясь на результате, кажется, что моя догадка была неправильной. Вывод не из-за подвыборки-запроса?

n затронутых строк будет поступать из вашего запроса на обновление. Он показывает, сколько строк было обновлено. Это не из-за подзапроса. Это потому, что ваш запрос обновления обновляет строки на основе вашего условия

  WHERE ID BETWEEN @StartID AND @EndID AND NewColumn IS NULL 
Давайте будем гением компьютера.