12
votes

Créer une procédure à l'intérieur de la section

J'ai besoin d'aide avec un code SQL simple: xxx

le code simple ci-dessus:

- déclare une variable int
- chèques si la procédure dbo.table_exists existe
- S'il n'existe pas, cela le crée

Mon problème est cette erreur d'erreur: xxx

Je ne sais pas pourquoi, mais..
- Quand j'exécute une «procédure de création» seul Ça fonctionne
- Quand j'exécute tout entier si la section à l'exclusion du corps "Créer une procédure", des travaux de requête simples
- Quand j'exécute tout entier si la section y compris "Créer une procédure", une erreur est lancée

Qu'est-ce que je manque?


0 commentaires

4 Réponses :


4
votes

de MSDN :

L'instruction Créer une procédure ne peut pas être associée à d'autres instructions de transact-SQL dans un seul lot.

Par conséquent, qu'est-ce que vous essayez de faire n'est pas possible, à moins que vous n'ayez bien de la mettre en œuvre via une requête dynamique.


0 commentaires

23
votes

Créer une procédure doit être à son propre lot

Donc, dynamique SQL est un moyen: xxx

ou déposer d'abord xxx < / Pré>

Notez l'utilisation d'objet_id pour voir si le procédé existe.


5 commentaires

Hmm .. devrais-je préférer vérifier avec objet_id ou via informations_schema? J'ai lu quelque part que l'utilisation d'informations_schema est une meilleure idée.


@dygi: J'utilise toujours objet_id mais c'est à vous de décider. Dans d'autres SDBMS, vous utiliseriez créer ou remplacer ou créer si pas de toute façon ne vous inquiétez pas de "portabilité"


Une chose plus. Cette modification est-elle correcte et sûre: Object_ID (Name (db_name () + N'.DBO.TABLE_EXIST ', N'P')


@Dygi: Oui, mais vous ne pouvez pas avoir créer proc db_name () + '.dbo.table_existes Vous devez donc être dans le contexte de DB correct déjà. Et vous ne pouvez pas avoir d'utiliser dans Dynamic SQL avec un processus Create ...


Entendu. Merci beaucoup.



17
votes

Vous pouvez le faire en utilisant SET NOEXEC sur CODE>. Cela indique SQL Server d'ignorer tous les indicateurs SQL jusqu'à ce que NOEXEC OFF CODE> est atteint.

IF EXISTS (SELECT *
          FROM INFORMATION_SCHEMA.ROUTINES
          WHERE ROUTINE_TYPE = 'PROCEDURE'
          AND ROUTINE_SCHEMA = 'dbo'
          AND ROUTINE_NAME = 'HelloWorld')
BEGIN
    SET NOEXEC ON
END
GO

CREATE PROCEDURE dbo.HelloWorld
AS
    PRINT 'Hello world'
GO

SET NOEXEC OFF
GO


1 commentaires

C'est propre. Je l'aime.



0
votes
if OBJECT_ID('PROC1') IS NULL  
   EXEC('CREATE PROCEDURE DBO.PROC1 AS SELECT 1')

GO

ALTER PROCEDURE DBO.PROC1(@PARAM1 INT, @PARAM2 INT)

AS
.................

0 commentaires