2008-10-10 19 views
6

używam SQLServer po raz pierwszy, a w każdym z naszych tworzyć skrypty procedura jest blok kodu jak poniżej, aby usunąć procedurę, jeśli już istnieje:PROCEDURA Give DROP parametrem

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

BEGIN 
    DROP PROCEDURE SomeProcedureName 
END 
//then the procedure definition 

aby powstrzymać wycinanie i wklejanie tego kodu szablonowe w każdym pliku Chciałbym umieścić ten kod w swojej własnej procedury przechowywane tak, że zamiast skrypty wyglądałby następująco:

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

Moja próba rozwiązania jest:

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 

Ale wtedy pojawia się następujący błąd:

Msg 102, Level 15, State 1, postępowanie DeleteProcedure, Linia 10 Niepoprawna składnia w pobliżu '@procedureName'.

Jakieś pomysły, jak robić to, co chcę?

+0

to [ta odpowiedź] (http://dba.stackexchange.com/q/47186/16776) więcej rozwiązań do tego. – Sam

Odpowiedz

7

Pełną odpowiedź brzmi:

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

Jednej podane przez Andrzeja będzie działać tylko wtedy, gdy domyślna baza danych do logowania znajduje się w bazie danych, którą chcesz. Używając dynamicznego sql otrzymujesz nowy kontekst bazy danych. Więc jeśli nie masz domyślnego zestawu baz danych, wykonasz polecenie z master.

+0

Tak, to jest poprawne. Zostałem wcześniej spalony przez to niedopatrzenie. – StingyJack

3

brakujące cytaty, spróbuj dodać je za pomocą instrukcji exec.

EXEC('DROP PROCEDURE ''' + @procName + '''') (all single quotes) 
+0

Może lepiej 'exec ('PROCEDURA DROP [' + @procName + ']')' – abatishchev

4

Należy zwrócić uwagę, że w procedurze DropIfRequired, zdefiniowaniu nazwy procedury następująco:

CREATE PROCEDURE DropIfRequired 
( 
    @procedureName varchar 
) 

Trzeba określić długość parametru varchar, inaczej SQL przyjmie długość jednego postać. Zamiast zrobić coś takiego jak następuje (1000 powinien być bardziej niż wystarczający dla większości nazw procedur)

CREATE PROCEDURE DropIfRequired 
( 
    @procedureName varchar(1000) 
) 
+0

Można również użyć sysname typu danych (odpowiednik nvarchar (128)), który pomieściłby dowolną prawidłową nazwę obiektu. – GilM

+0

"1000 powinno wystarczyć dla * większości * nazw procedur" ... wzdrygam się, myśląc o wyjątkach. –