J'ai besoin d'aide avec un code SQL simple: le code simple ci-dessus: Mon problème est cette erreur d'erreur: p> Je ne sais pas pourquoi, mais.. Qu'est-ce que je manque? p> p>
- déclare une variable int
- chèques si la procédure dbo.table_exists existe
- S'il n'existe pas, cela le crée p>
- Quand j'exécute une «procédure de création»
- Quand j'exécute tout entier si la section
- Quand j'exécute tout entier si la section
4 Réponses :
de MSDN : P>
L'instruction Créer une procédure ne peut pas être associée à d'autres instructions de transact-SQL dans un seul lot. p> blockQuote>
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. P>
Créer une procédure doit être à son propre lot
Donc, dynamique SQL est un moyen: p> ou déposer d'abord p> Notez l'utilisation d'objet_id pour voir si le procédé existe. P> p>
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 code> ou créer si pas code> 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 code> 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.
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
C'est propre. Je l'aime.
if OBJECT_ID('PROC1') IS NULL
EXEC('CREATE PROCEDURE DBO.PROC1 AS SELECT 1')
GO
ALTER PROCEDURE DBO.PROC1(@PARAM1 INT, @PARAM2 INT)
AS
.................