Дайте DROP PROCEDURE параметр - PullRequest
       16

Дайте DROP PROCEDURE параметр

6 голосов
/ 10 октября 2008

Я впервые использую SqlServer, и в каждом из наших сценариев создания процедуры есть блок кода, подобный приведенному ниже, для удаления процедуры, если она уже существует:

IF EXISTS (SELECT *
           FROM information_schema.routines
           WHERE routine_name = 'SomeProcedureName'
           AND routine_type = 'PROCEDURE'

BEGIN
    DROP PROCEDURE SomeProcedureName
END
//then the procedure definition

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

DropIfRequired('SomeProcedureName')
//then the procedure definition

Моя попытка найти решение:

CREATE PROCEDURE DropIfRequired
(
    @procedureName varchar
)
AS
IF EXISTS (SELECT * FROM information_schema.routines 
           WHERE routine_name = @procedureName 
           AND routine_type = 'PROCEDURE') 
BEGIN
    DROP PROCEDURE @procedureName
END

Но тогда я получаю следующую ошибку:

Сообщение 102, уровень 15, состояние 1, процедура удаления, строка 10 Неверный синтаксис рядом с'@procedureName'.

Есть идеи, как делать то, что я хочу?

Ответы [ 3 ]

7 голосов
/ 10 октября 2008

Полный ответ:

DECLARE @SQL VARCHAR(8000)
SELECT @SQL = 'USE ' + DB_NAME() + CHAR(10)
SET @SQL = @SQL + 'DROP PROCEDURE ' + @procName
--PRINT @SQL
EXEC(@SQL)

Тот, который предоставил Эндрю, будет работать только в том случае, если в качестве базы данных по умолчанию для вашего логина выбрана необходимая база данных. При использовании динамического sql вы получаете новый контекст базы данных. Поэтому, если у вас нет базы данных по умолчанию, вы выполните команду от master.

4 голосов
/ 10 октября 2008

Следует отметить, что в процедуре DropIfRequired вы определили имя процедуры следующим образом:

CREATE PROCEDURE DropIfRequired
(    
   @procedureName varchar
)

Вам необходимо определить длину параметра varchar, в противном случае SQL будет принимать длину в один символ. Вместо этого сделайте что-то вроде следующего (1000 должно быть более чем достаточно для большинства имен процедур)

CREATE PROCEDURE DropIfRequired
(    
   @procedureName varchar(1000)
)
3 голосов
/ 10 октября 2008

пропущенные кавычки, попробуйте добавить их с помощью оператора exec.

EXEC( 'DROP PROCEDURE ''' + @procName + '''') ( all single quotes)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...