Надежность @@ROWCOUNT
показывает, сколько строк соответствовало предложению WHERE
в UPDATE
, в отличие от того, сколько из них действительно изменилось?
В документации для @@ROWCOUNT
говорится:
Операторы языка манипуляции данными (DML) устанавливают значение
@@ROWCOUNT
в число строк , затронутых, и возвращают это значение клиенту.
(Мой акцент.)
Но если я
CREATE TABLE [Foo] ([a] INT, [b] INT)
GO
INSERT INTO [Foo] ([a], [b]) VALUES (1, 1),(1, 2),(1, 3),(2, 2)
GO
UPDATE [Foo] SET [b] = 1 WHERE [a] = 1
SELECT @@ROWCOUNT
GO
... Я вижу 3
(количество строк, соответствующих [a] = 1
), а не 2
(количество строк, измененных UPDATE
— в одной из трех строк уже было значение 1
для b
). Это похоже на странное определение "затронутого" (не так, просто противоречит тому, как я обычно использую слово — на самом деле это очень удобно для того, что я хочу делать).
(Подобная функция MySQL ROW_COUNT
, например, вернула бы 2
в этой ситуации.)
Является ли это надежное поведение, идеально документированное где-то, чего я просто не нашел? Или есть случаи с нечетными краями...
Чтобы быть ясным: Я не спрашиваю, правильный ли 3
. Я спрашиваю, отвечает ли это надежный ответ, или есть крайние случаи, когда SQL Server оставляет строки, которые соответствуют, но не требуют изменений.
Обновление. Несколько человек спросили (или намекнули), какие проблемы с "надежностью" я волнуюсь. Дело в том, что они довольно туманны, но, неслучайно, тиражирование? Сделки? Разметка? Индексы, которые он может использовать, чтобы избежать поиска строк, поскольку он знает, что b
уже 1
, и поэтому он пропускает их?...
Обновление. Я надеялся, что кто-то с более "инсайдерским" представлением о том, как SQL Server работает, чтобы ответить на этот вопрос, но он выглядит как пример триггеров (и другие, с которыми я играл) от xacinay так близко, как мы собираемся получить. И это кажется довольно проклятым. если он ведет себя таким образом в нормальном случае, и он не вел себя так, несмотря на разделение или whatsit, как сказал кто-то, наверняка это квалифицировалось бы как ошибка. Это просто эмпирическое, а не академическое.