2008-10-10 10 views
6

Ben zaten varsa prosedürü kaldırmak için ilk defa SqlServer kullanarak ve bizim oluşturmak prosedür komut her birinde aşağıda gibi kod bloğu vardır ediyorum:Ver DAMLA USULÜ bir parametre

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 

bir çözüme Benim girişimdir:

yerine komut şu şekilde görünecektir böylece kendi saklı yordam Bu kodu koymak istiyorum kesme durdurmak ve her dosyada bu Demirbaş kodu yapıştırarak için

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 

Ama sonra aşağıdaki hatayı alıyorum:

Msg 102, Düzey 15, State 1, Procedure DeleteProcedure, Hat 10 yanlış sözdizimi yakın '@procedureName'.

İstediğim şeyleri nasıl yaparım?

+0

Bu [Bu cevap] (http://dba.stackexchange.com/q/47186/16776) daha çözümler için buna. – Sam

cevap

7

tam cevap:

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

giriş için varsayılan veritabanı istediğiniz veritabanına ayarlanırsa durumunda çalışacaktır Andrew tarafından verilen bir. Dinamik sql kullanırken yeni bir veritabanı içeriği olsun. Öyleyse, varsayılan bir veritabanı kümeniz yoksa, komutu master'den yürütürsünüz.

CREATE PROCEDURE DropIfRequired 
( 
    @procedureName varchar 
) 

aksi halde SQL birinin uzunluğu üstlenecek, varchar parametresinin uzunluğu tanımlamak gerekir: nota

+0

Evet, bu doğru. Daha önce bu gözetimle yakılmıştım. – StingyJack

3

eksik tırnakları, bunları bir exec ifadesine ekleyerek deneyin.

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

Belki de daha iyi 'exec ('DAMLA PROSEDÜR [' + @procName + ']')' – abatishchev

4

Bir şey aşağıdaki gibi DropIfRequired prosedüründe, yordam adını tanımlanmış olmasıdır karakter. Bunun yerine, aşağıdaki gibi böyle bir şey yapmak (1000 En prosedür adları için fazlasıyla yeterli olmalıdır)

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

Ayrıca, herhangi bir geçerli nesne adı barındıracak datatype sysname (nvarchar (128) eşdeğeri) kullanabilirsiniz. – GilM

+0

"1000 * en * prosedür isimleri için fazlasıyla yeterli olmalıdır" ... İstisnaları düşünmek için titriyorum. –