J'ai un script SQL qui doit être exécuté chaque fois qu'un client exécute la fonctionnalité de "gestion de base de données". Le script comprend la création de procédures stockées sur la base de données client. Certains de ces clients peuvent déjà avoir la procédure stockée lors de l'exécution du script, et d'autres pas. J'ai besoin que les procédures stockées manquantes soient ajoutées à la base de données client, mais peu importe combien j'essaie de plier la syntaxe T-SQL, j'obtiens
CREATE / ALTER PROCEDURE 'doit être la première instruction d'un lot de requêtes
J'ai lu ça avant de créer des œuvres, mais je n'aime pas le faire de cette façon.
IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'MyProc')
DROP PROCEDURE MyProc
GO
CREATE PROCEDURE MyProc
...
Comment puis-je ajouter la vérification de l'existence d'une procédure stockée et la créer si elle n'existe pas mais la modifier si elle existe?
la source
Réponses:
Vous pouvez exécuter du code procédural partout où vous pouvez exécuter une requête.
Il suffit de tout copier après
AS
:Ce code fait exactement les mêmes choses qu'un proc stocké ferait, mais n'est pas stocké du côté base de données.
Cela ressemble beaucoup à ce qu'on appelle la procédure anonyme dans
PL/SQL
.Mettre à jour:
Le titre de votre question est un peu déroutant.
Si vous avez seulement besoin de créer une procédure si elle n'existe pas, alors votre code est très bien.
Voici ce qui
SSMS
sort dans le script de création:Mettre à jour:
Exemple de procédure à suivre lors de l'inclusion du schéma:
Dans l'exemple ci-dessus, dbo est le schéma.
Mettre à jour:
Dans SQL Server 2016+, vous pouvez simplement faire
CREATE OR ALTER PROCEDURE dbo.MyProc
la source
@astander
: vous pouvez également appeler du code anonyme à partir des procédures stockées. Pour utiliser leur sortie dans unINSERT
, vous devrez également utiliserOPENROWSET
ouOPENQUERY
qui fonctionne avec le code anonyme. Bien sûr, le code anonyme présente des inconvénients: par exemple, il ne s'exécute que sous les privilèges de l'appelant. Mon point est qu'il est possible, pas une façon préférée de faire les choses :)Je me rends compte que cela a déjà été marqué comme répondu, mais nous le faisions comme ceci:
Juste pour éviter de laisser tomber la procédure.
la source
GRANT
déclarations soient explicites dans le script au cas où elles changeraient ; il est donc toujours justifié d'utiliser à laDROP
place deALTER
.Si vous cherchez le moyen le plus simple de vérifier l'existence d'un objet de base de données avant de le supprimer, voici un moyen (l'exemple utilise un SPROC, tout comme votre exemple ci-dessus mais pourrait être modifié pour les tables, les index, etc ...):
C'est rapide et élégant, mais vous devez vous assurer que vous avez des noms d'objet uniques sur tous les types d'objet car il n'en tient pas compte.
J'espère que ça aide!
la source
Je sais que vous voulez "modifier une procédure si elle existe et la supprimer uniquement si elle n'existe pas", mais je pense qu'il est plus simple de simplement toujours supprimer la procédure, puis de la recréer. Voici comment supprimer la procédure uniquement si elle existe déjà:
Le deuxième paramètre indique
OBJECT_ID
de ne rechercher que les objets avecobject_type = 'P'
, qui sont des procédures stockées:Vous pouvez obtenir la liste complète des options via:
la source
Depuis SQL SERVER 2016, vous pouvez utiliser le nouveau
DROP PROCEDURE IF EXISTS
.DROP { PROC | PROCEDURE } [ IF EXISTS ] { [ schema_name. ] procedure } [ ,...n ]
Référence: https://msdn.microsoft.com/en-us/library/ms174969.aspx
la source
Je sais que c'est un article très ancien, mais puisque cela apparaît dans les premiers résultats de recherche, ce qui ajoute la dernière mise à jour pour ceux qui utilisent SQL Server 2016 SP1 -
Cela crée une procédure stockée si elle n'existe pas déjà, mais la modifie si elle existe.
Référence
la source
DROP IF EXISTS est une nouvelle fonctionnalité de SQL Server 2016
https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/
la source
J'ai eu la même erreur. Je sais que ce fil est déjà pratiquement mort, mais je veux définir une autre option en plus de la "procédure anonyme".
Je l'ai résolu comme ceci:
Vérifiez si la procédure stockée existe:
Cependant, le
"CREATE/ALTER PROCEDURE' must be the first statement in a query batch"
est toujours là. Je l'ai résolu comme ceci:Je me retrouve avec ce code:
la source
Voici une méthode et un raisonnement derrière son utilisation de cette façon. Ce n'est pas aussi joli d'éditer le proc stocké mais il y a des avantages et des inconvénients ...
MISE À JOUR: Vous pouvez également envelopper tout cet appel dans une TRANSACTION. Inclusion de nombreuses procédures stockées dans une seule transaction pouvant toutes être validées ou annulées. Un autre avantage de l'encapsulation dans une transaction est que la procédure stockée existe toujours pour les autres connexions SQL tant qu'elles n'utilisent pas le niveau d'isolement de transaction READ UNCOMMITTED!
1) Pour éviter les modifications tout comme une décision de processus. Nos processus sont à toujours SI EXISTE BAISSE PUIS CRÉE. Si vous faites le même modèle en supposant que le nouveau PROC est le proc souhaité, la restauration des modifications est un peu plus difficile car vous auriez un IF EXISTS ALTER ELSE CREATE.
2) Vous devez mettre CREATE / ALTER comme premier appel d'un lot afin de ne pas pouvoir encapsuler une séquence de mises à jour de procédure dans une transaction en dehors de SQL dynamique. Fondamentalement, si vous souhaitez exécuter toute une pile de mises à jour de procédures ou les restaurer toutes sans restaurer une sauvegarde de base de données, c'est un moyen de tout faire en un seul lot.
la source
Dans Sql server 2008 onwards, vous pouvez utiliser "
INFORMATION_SCHEMA.ROUTINES
"la source
Apparemment, je n'ai pas la réputation requise pour voter ou commenter, mais je voulais juste dire que la réponse de Geoff en utilisant EXEC (sp_executesql pourrait être mieux) est certainement la voie à suivre. La suppression puis la recréation de la procédure stockée finissent par faire le travail, mais il y a un moment où la procédure stockée n'existe pas du tout, et cela peut être très mauvais, surtout si c'est quelque chose qui sera exécuter à plusieurs reprises. J'avais toutes sortes de problèmes avec mon application car un thread d'arrière-plan effectuait un IF EXISTS DROP ... CREATE en même temps qu'un autre thread essayait d'utiliser la procédure stockée.
la source
** Le moyen le plus simple de supprimer et de recréer un proc stocké dans T-Sql est **
la source
Voici le script que j'utilise. Avec cela, j'évite de supprimer et de recréer inutilement les proc stockés.
la source
Vérifiez s'il existe une procédure stockée
Vérifiez IF Exist for Trigger, Function également en cliquant sur le lien ci-dessous http://www.gurujipoint.com/2017/05/check-if-exist-for-trigger-function-and.html
la source
pourquoi tu ne vas pas de la manière simple comme
..........
la source
%
, donc ilLIKE
se comporte comme=
En plus de la réponse de @Geoff, j'ai créé un outil simple qui génère un fichier SQL contenant des instructions pour les procédures stockées, les vues, les fonctions et les déclencheurs.
Voir MyDbUtils @ CodePlex .
la source
Je me demande! Pourquoi je n'écris pas la requête entière comme
je sais déjà que les deux premières procédures existent déjà sql exécutera la requête donnera l'erreur des deux premières procédures mais toujours il créera la dernière procédure SQl s'occupe de ce qui existe déjà c'est ce que je fais toujours pour tous mes clients!
la source
CRÉER Procédure SI IL N'EXISTE PAS 'Votre nom de proc' () COMMENCER ... FIN
la source