При появлении ошибки возобновить работу для Microsoft SQL при использовании sp_MSforeachtable? - PullRequest
0 голосов
/ 10 сентября 2011

Я делаю скрипт, который удаляет все таблицы перед тем, как воссоздать их с помощью Entity Framework. Я сделал это, реализовав IDatabaseInitializer, который делает это для меня.

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

Как я могу предотвратить это? Вот как я опускаю столы.

context.Database.ExecuteSqlCommand("EXEC sp_MSforeachtable @command1 = \"DROP TABLE ?\"");

Теперь я поместил это в цикл while, который продолжает выполняться, пока не будут удалены все таблицы. Однако, поскольку эта команда удаляет все таблицы по порядку и завершается неудачно, если не удается удалить первую таблицу, этот сценарий не работает.

Есть ли способ заставить Microsoft SQL Server игнорировать любые ошибки и возобновить удаление таблицы с помощью следующей записи?

1 Ответ

2 голосов
/ 10 сентября 2011

Нет

Вы должны использовать какой-то сценарий SQL, чтобы выполнить итерацию несколько раз, чтобы иметь дело с несколькими уровнями FK.

DECLARE @retry bit = 1

WHILE @retry = 1
BEGIN
    BEGIN TRY
       EXEC sp_MSforeachtable @command1 = 'DROP TABLE ?'
       SET @retry = 0
    END TRY
    BEGIN CATCH
       SET @retry = 1
    END CATCH
END

Примечание: удаление всех таблиц обычно не то, что вы делаете в клиентском коде.Не менее важно, что для изменения объектов требуются более высокие привилегии

Другой способ - сначала удалить FK, запросив sys.objects: Удалить все внешние ключи в таблице , а затем выполнить DROP TABLEs

Последнее замечание: используйте одинарные кавычки, а не двойные кавычки в SQL из-за SET QUOTED_IDENTIFIER

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