@@ ROWCOUNT неверно при удалении (SQL Server 2017) - PullRequest
0 голосов
/ 27 апреля 2019

Я никогда не сталкивался с этим раньше.Я пытаюсь убедиться, что запрос точный, поэтому я делаю это:

SELECT * FROM MyTable mt
   JOIN OtherTable ot ON ot.ID = mt.OtherTableID
   JOIN @tablevar tv ON tv.ID = mt.TableVarID;

DELETE mt FROM MyTable mt
   JOIN OtherTable ot ON ot.ID = mt.OtherTableID
   JOIN @tablevar tv ON tv.ID = mt.TableVarID;

SELECT @@ROWCOUNT;

SELECT * FROM MyTable mt
   JOIN OtherTable ot ON ot.ID = mt.OtherTableID
   JOIN @tablevar tv ON tv.ID = mt.TableVarID;

Цифры, которые я получаю, однако, странно отклоняются.Я получаю следующие результаты:

Таблица с 5208 строками

Успех - затронуто 51 строка

51

Пустая таблица

Часть, которую я не получаю, такова: условия выбора и удаления, насколько я могу судить, идентичны.Так почему же SELECT возвращает 5 тыс. Строк, DELETE удаляет 51 строку, @@ROWCOUNT утверждает, что были затронуты только 51 строки, а окончательный SELECT показывает, что было удалено правильное количество строк (5 КБ)?

Я знаю, что @@ROWCOUNT довольно хрупкий - все перезапишет, почти.Поэтому я искал триггеры в рассматриваемой таблице и не нашел ни одного.

Кто-нибудь сталкивался с этим?

1 Ответ

3 голосов
/ 27 апреля 2019

Вы удаляете строки из MyTable. Итак, delete говорит, что из этой таблицы удаляется 51 строка.

Ваш select имеет два соединения, которые явно умножают количество строк.

Если вы хотите увидеть, что удаляется, используйте exists:

SELECT mt.*
FROM MyTable mt
WHERE EXISTS (SELECT 1
              FROM OtherTable ot JOIN
                   @tablevar tv
                   ON tv.ID = mt.TableVarID
              WHERE ot.ID = mt.OtherTableID
             );

Вы можете использовать ту же логику в DELETE.

Кроме того, чтобы увидеть, какие строки действительно удаляются, вы можете рассмотреть предложение OUTPUT. Это позволяет вам видеть строки, а не только счет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...