Надежность @@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, как сказал кто-то, наверняка это квалифицировалось бы как ошибка. Это просто эмпирическое, а не академическое.