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 :

Interrompre un script selon des conditions


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Par défaut Interrompre un script selon des conditions
    Bonjour,
    Nous avons dans le cadre d'une reprise à passer différents script dans un ordre particulier sur deux bases de données. Nous avons donc un document décrivant les étapes du genre.
    Passer Script 1 sur base A
    Passer Script 2 sur base A
    Passer script 3 sur base B
    Faire telle opération
    Lancer script 4 sur base A.

    Je crains les erreurs lors du suivi du mode opératoire, et par exemple que le script 1 soit passé sur la base B. Je voudrais donc blinder mes scripts pour qu'ils partent en erreur et ne s’exécute pas en cas d'erreur de base de données. Le problème est que ces scripts contiennent des GO
    Voici ce que j'ai essayé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SET XACT_ABORT ON;
    if db_name() not like 'CNET%' 
    begin
    raiserror('Ce script ne doit pas être joué sur cette base de données',16,1)	
     
    end
    GO
    select 'Je ne dois pas voir ce message'
    GO
    Voilà ce que j'obtiens
    Msg 50000, Level 16, State 1, Line 4
    Ce script ne doit pas être joué sur cette base de données

    Je ne dois pas voir ce message

    (1 row(s) affected)
    Deuxième essai
    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
     
    if db_name() not like 'CNET%' 
    begin
    	GOTO ErreurBD
     
    end
    --GO
    select 'Je ne dois pas voir ce message'
    --GO
     
    GOTO fin
    ErreurBD:
    raiserror('Ce script ne doit pas être joué sur cette base de données',16,1)	
     
    fin:
    Qui donne bien le résultat attendu tant que je ne décommente pas les GO.
    Y-a t-il une solution à mon problème, sachant que je ne suis pas sure de pouvoir supprimer tous les GO.
    Merci de votre aide
    Soazig

  2. #2
    Membre émérite Avatar de GeekMokona
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2011
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2011
    Messages : 327
    Par défaut
    essaie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SET XACT_ABORT ON;
    IF db_name() NOT LIKE 'CNET%' 
    begin
    raiserror('Ce script ne doit pas être joué sur cette base de données',18,1)	
     
    end
    GO
    SELECT 'Je ne dois pas voir ce message'
    GO
    ou au pire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SET XACT_ABORT ON;
    IF db_name() NOT LIKE 'CNET%' 
    begin
    raiserror('Ce script ne doit pas être joué sur cette base de données',18,1)	
     
    end
    Else
    Begin
     
    SELECT 'Je ne dois pas voir ce message'
     
    end

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Par défaut
    Bonjour,
    Pour la première requête,j'ai le même résultat qu'avec un niveau 16.
    Pour la deuxième
    Msg 102, Level 15, State 1, Line 8
    Syntaxe incorrecte vers 'Begin'.

    Je ne dois pas voir ce message

    (1 row(s) affected)

    Msg 102, Level 15, State 1, Line 1
    Syntaxe incorrecte vers 'end'.
    C'est normal, après un GO c'est comme si on commençait un nouveau script.
    S'il y a d'autres propositions je prends.
    Merci
    Soazig

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Une solution serait de mettre le script dans un EXEC, lequel serait conditionné par le test de db_name().
    Le problème c'est que cela peut être assez fastidieux, car il faut souvent modifier le script pour cela (par exemple, doubler les guillemets,...)

    Une alternative : apparemment, le but est d’empêcher que le script ne soit exécuté sur la mauvaise base suite à une erreur de manip. Il semble donc que ces scripts seront exécutés à la main, par exemple dans SSMS ?

    Dans ce cas peut-être pourriez vous ajouter ceci en début de script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    WHILE(db_name() not like 'CNET%')
    BEGIN
    	raiserror('Ce script ne doit pas être joué sur cette base de données, veuillez annuler l''exécution du script et sélectionner la bonne base',16,1) WITH NOWAIT
    	SELECT 'Veuillez regarder les message d''erreur' --> car sinon l'opérateur, qui déjà ne sait pas sélectionner la bonne base, va attendre pendant des heures la fin de l’exécution du script :)
    	waitfor delay '01:00:00'
    end
    L'idée est donc une boucle sans fin si le script n'est lancé sur la bonne base... pas très subtil, mais efficace

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Par défaut
    Bonjour,
    La solution de aieeeuuuuu fonctionne très bien, et si personne ne me suggère autre chose d'ici demain, elle sera adoptée.
    Mais si vous avez plus élégant comme solution je prends.
    Cordialement
    Soazig

  6. #6
    Invité
    Invité(e)
    Par défaut
    Et avec un bon vieux GOTO des familles ?

    http://msdn.microsoft.com/fr-fr/library/ms180188.aspx

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] insertion d'image selon des conditions
    Par Vincent91 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 30/06/2011, 17h57
  2. afficher des ecrans selon des conditions
    Par chamssou dans le forum SAP
    Réponses: 5
    Dernier message: 24/03/2011, 13h54
  3. afficher des ecrans selon des conditions
    Par chamssou dans le forum SAP
    Réponses: 1
    Dernier message: 24/03/2011, 12h35
  4. Réponses: 13
    Dernier message: 22/07/2009, 14h36
  5. [SQL Server 8] fonction Max --- selon des conditions
    Par Baquardie dans le forum Langage SQL
    Réponses: 2
    Dernier message: 31/01/2006, 21h06

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