IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Créer une PROC STOCK si elle n'existe pas.


Sujet :

MS SQL Server

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 21
    Points : 11
    Points
    11
    Par défaut Créer une PROC STOCK si elle n'existe pas.
    Bonjour,

    Je cherche ecrire un script en transact SQL qui crée une procédure stocké si elle n'existe pas et qui ne fait rien sinon.

    J'ai essayé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    if not exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[MA_PROC]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    BEGIN
       SET QUOTED_IDENTIFIER ON 
       GO
       SET ANSI_NULLS OFF 
       GO
     
       CREATE        PROCEDURE [DBO].[MA_PROC]
       @VAR1 NVARCHAR(100),@VAR2 NVARCHAR(250)
       AS
          ...
     
       GO
       SET QUOTED_IDENTIFIER OFF 
       GO
       SET ANSI_NULLS ON 
       GO
    END
    Mais sans succès...

    EDIT pour précision : je suis sous SQL Server 2000

  2. #2
    Membre habitué Avatar de PierreDelcroix
    Profil pro
    Inscrit en
    Février 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 90
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2007
    Messages : 86
    Points : 192
    Points
    192
    Par défaut
    Bonjour,

    Il se passe quoi? Une faute, ça ne marche pas, ... ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 21
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par PierreDelcroix
    Bonjour,

    Il se passe quoi? Une faute, ça ne marche pas, ... ?
    Pardon je n'ai pas pensé à en mettre plus...
    Lorsque je valide mon code précédent j'obtiens l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Server: Msg 170, Level 15, State 1, Line 4
    Line 4: Incorrect syntax near 'ON'.
    Server: Msg 156, Level 15, State 1, Line 2
    Incorrect syntax near the keyword 'END'.
    Alors j'ai testé le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    SET QUOTED_IDENTIFIER ON 
    GO
    SET ANSI_NULLS OFF 
    GO
     
    IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[MA_PROC]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
    BEGIN
       CREATE        PROCEDURE [DBO].[MA_PROC]
       @VAR1 NVARCHAR(100),@VAR2 NVARCHAR(250)
       AS
          ...
    END
     
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GO
    et lorsque je valide j'obtiens l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Server: Msg 156, Level 15, State 1, Line 4
    Incorrect syntax near the keyword 'PROCEDURE'.
    Server: Msg 137, Level 15, State 1, Line 9
    Must declare the variable '@VAR1'.
    Server: Msg 137, Level 15, State 1, Line 15
    Must declare the variable '@VAR2'.

  4. #4
    Membre expérimenté Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Points : 1 337
    Points
    1 337
    Par défaut
    Je crois que tu ne dois mettre de crochets entre DBO et MA_PROC :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE  PROCEDURE DBO.MA_PROC
       @VAR1 NVARCHAR(100), 
       @VAR2 NVARCHAR(250)
       AS

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 21
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par slim
    Je crois que tu ne dois mettre de crochets entre DBO et MA_PROC :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE  PROCEDURE DBO.MA_PROC
       @VAR1 NVARCHAR(100), 
       @VAR2 NVARCHAR(250)
       AS
    Avec ou sans crochets le résultats est le même.

    En fait, les crochets sont là pour définir le nom. Je m'explique, si on souhaite nommer un objet "mon objet" (avec un espace) on ne peut le faire qu'avec les crochets. Sinon l'espace est considéré par le compilateur comme un changement d'instruction...

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 21
    Points : 11
    Points
    11
    Par défaut
    Je viens de trouver un workarround...

    En fait je suis dans un DTS et je souhaitais créer une procédure stockée si celle ci n'existais pas déjà.

    La solution qui me parraissait la plus simple était de passer par du transact SQL puis d'encapsuler ce code dans une tâche SQL DTS. Mais n'y arrivant pas je fais autrement.

    En fait je crée deux tâches DTS :
    - une tache SQL DTS contenant le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    If exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[MA_PROC]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    	select 1 as BOOL
    Else
    	select 0 as BOOL
    et je retourne le résultat (1 ou 0) dans une variable globale (appelée BOOL)
    - une tache SQL DTS créant la procédure stocké :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SET QUOTED_IDENTIFIER ON 
    GO
    SET ANSI_NULLS OFF 
    GO
     
    CREATE PROCEDURE [DBO].[MA_PROC]
    @VAR1 NVARCHAR(100),@VAR2 NVARCHAR(250)
    AS
       ...
    Mon problème devient alors d'executer cette tâche si et seulement si la variable globale BOOL = 0

    Ce que je fais en utilisant de l'activX Script dans les propriétés de workflow de ma tâche DTS.

    Merci pour tout !

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 862
    Points : 53 015
    Points
    53 015
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    IF NOT EXISTS (SELECT *
                  FROM   INFORMATION_SCHEMA.ROUTINES
                  WHERE  ROUTINE_NAME = '???'
                    AND  ROUTINE_SCHEMA = 'dbo')
    BEGIN
     
    CREATE PROCEDURE ???
     
    ...
     
     
    END
    Pourquoi vous emmerder avec les tables systèmes alors que les vues d'information de schmé sont claires et portables ??? Ce qui n'est pas le cas des tables systèmes...

    A +

  8. #8
    Invité
    Invité(e)
    Par défaut
    Pourquoi vous emmerder avec les tables systèmes alors que les vues d'information de schmé sont claires et portables ??? Ce qui n'est pas le cas des tables systèmes...
    Parce que Bilay est sous SQL 2000.

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 862
    Points : 53 015
    Points
    53 015
    Billets dans le blog
    6
    Par défaut
    Les vues d'information de schéma existent depuis la version 6... ou à peu près !

    A +

  10. #10
    Invité
    Invité(e)
    Par défaut
    Tiens j'avais pas remarqué ça sous 2000...
    Désolé.

Discussions similaires

  1. [XL-2003] Création d'une nouvelle feuille si elle n'existe pas
    Par panda31 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 05/08/2011, 14h22
  2. Réponses: 15
    Dernier message: 27/12/2009, 12h13
  3. Réponses: 3
    Dernier message: 20/05/2009, 13h33
  4. Réponses: 3
    Dernier message: 07/01/2009, 19h03
  5. Créer une procedure si elle n'existe pas.
    Par Chouls dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 10/01/2007, 10h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo