Multiple Go в хранимой процедуре - PullRequest
       11

Multiple Go в хранимой процедуре

1 голос
/ 12 декабря 2011

Я хотел бы написать хранимую процедуру и сохранить ее в базе данных SQL Server.Предполагается, что процедура удаляет все таблицы независимо от ограничений зависимостей.

CREATE PROCEDURE sp_clear_db AS
BEGIN
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL';
EXEC sp_MSForEachTable 'DROP TABLE ?';
END

Однако, когда я вызываю sp_helptext @objname = 'dbo.sp_clear_db', отображается только первый оператор exec.Я предполагаю, что для выполнения первой функции необходимо вызвать GO.Но GO как часть определения хранимой процедуры также не будет работать.Кто-нибудь знает способ исправить это?Может быть, есть другой лучший вариант для достижения того же ...

Ура, Макс

Ответы [ 2 ]

4 голосов
/ 23 декабря 2011

Вы не можете иметь «GO» в хранимой процедуре.(http://msdn.microsoft.com/en-us/library/ms188037.aspx) GO используется анализатором SQL Query для разделения операторов на «Пакеты», которые затем отправляются на сервер SQL. Поэтому вам необходимо выполнить два отдельных вызова, один для вызовов ALTER и один для DROP.

В идеале вы бы просто вызывали «DROP DATABASE», если только вы не пытались сохранить свои сохраненные данные, а затем заново создавали таблицы.

Другим решением было бы использование курсора для циклического просмотракаждая строка в sys.tables, где type = 'U' и генерирует некоторый динамический sql для удаления ограничений и удаления таблицы.

1 голос
/ 12 декабря 2011

Не используйте sp_helptext. Используйте OBJECT_DEFINITION или sys.sql_modules

...