2008-10-10 8 views
6

J'utilise SqlServer pour la première fois, et dans chacun de nos scripts de création de la procédure il y a un bloc de code comme ci-dessous pour supprimer la procédure si elle existe déjà:Donner DROP PROCEDURE un paramètre

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

BEGIN 
    DROP PROCEDURE SomeProcedureName 
END 
//then the procedure definition 

pour arrêter de couper et coller ce code boilerplate dans chaque fichier que je voudrais mettre ce code dans sa propre procédure stockée de sorte qu'au lieu les scripts ressemblerait à ceci:

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

Ma tentative de solution est:

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 

Mais j'obtiens alors l'erreur suivante:

Msg 102, Niveau 15, État 1, Procédure deleteProcedure, ligne 10 syntaxe incorrecte près de '@procedureName'.

Des idées comment faire ce que je veux?

+0

Ce [cette réponse] (http://dba.stackexchange.com/q/47186/16776) pour plus de solutions pour ça. – Sam

Répondre

7

La réponse complète est:

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

celle donnée par Andrew ne fonctionnera que si la base de données par défaut pour votre connexion est défini sur la base de données que vous voulez. Lorsque vous utilisez SQL dynamique, vous obtenez un nouveau contexte de base de données. Donc, si vous n'avez pas de base de données par défaut, vous allez exécuter la commande à partir de master.

+0

Oui, c'est correct. J'ai été brûlé par cet oubli avant. – StingyJack

3

ses guillemets manquants, essayez de les ajouter avec une instruction exec.

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

Peut-être mieux 'exec ('DROP PROCEDURE [' + @procName + ']')' – abatishchev

4

Une chose à noter est que, dans la procédure DropIfRequired, vous avez défini le nom de la procédure comme suit:

CREATE PROCEDURE DropIfRequired 
( 
    @procedureName varchar 
) 

Vous devez définir une longueur du paramètre varchar, sinon SQL prendra une longueur d'un personnage. Au lieu de cela, faire quelque chose comme ce qui suit (1000 devrait être plus que suffisant pour la plupart des noms de procédure)

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

Vous pouvez également utiliser le type de données sysname (équivalent de nvarchar (128)), qui accepterait n'importe quel nom d'objet valide. – GilM

+0

"1000 devrait être plus que suffisant pour * la plupart * des noms de procédures" ... Je frémis de penser aux exceptions. –