Безопасное удаление в SQL Server - PullRequest
2 голосов
/ 17 марта 2011

Я пытаюсь удалить строки таблицы, используя пользовательскую табличную функцию в предложении where.

Как это:

DELETE FROM TABLE WHERE ID NOT IN(SELECT ID FROM MYFUNCTION(DATE));

Моя функция выбирает записи из таблиц с несколькими объединениями. Предполагалось, что эта функция должна вернуть несколько строк. У меня не было проблем с этим. До одного случая, когда все строки были удалены. После расследования я пришел к выводу, что функция должна что-то возвращать. Есть ли случаи, когда функция не могла ничего вернуть, например, Когда SQL Server выполняет некоторые задачи (резервное копирование, любая проверка, восстановление любых других баз данных)

Последний тест показал, что если псевдо-функция возвращает NULL или NULL, например, (1,NULL,5) абсолютно ничего не удаляется.

Я использую Microsoft SQL Server 2008.

1 Ответ

2 голосов
/ 21 марта 2011

Есть ли случаи, когда функция не мог ничего вернуть, например Когда SQL Сервер выполняет некоторые задачи (Резервное копирование, любая проверка, восстановление любого другие базы данных)

Хотя вполне возможно, что любой dbms может сделать что-то подобное, изменение поведения из-за запуска других задач будет огромной, пламенной, критической ошибкой. Это будет так широко освещаться, что будет трудно пропустить новости.

Слышали ли вы когда-нибудь поговорку: «Когда вы слышите копыта, думайте« лошади », а не« зебры »»? Гораздо более вероятно, что слышимые вами удары - это ошибка в вашем коде, а не ошибка в их коде.

Мои предположения будут неуместным пареном, тестом isnull (), который возвращает что-то, чего вы не ожидали, неожиданное распространение NULL или арифметику с ошибкой даты. Кажется, у тебя много столбцов, которые можно обнулять.

Это выражение выглядит подозрительно.

Dateadd(DAY,-2,Dateadd(MONTH,1,@prad)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...