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 :

transaction avec des requetes de structure


Sujet :

MS SQL Server

  1. #1
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut transaction avec des requetes de structure
    bonjour

    j'ai plein de requetes de structure à executer (create procedure, create table, create trigger ...)

    à priori pour les enchainer il faut des GO entre chaque

    je voudrais aussi que tout soit fait dans une transaction, pour que si l'une des requetes ne fonctionne pas je puisse rester dans l'état précédent

    or begin tran n'a pas l'air d'apprécier qu'il y a des GO

    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
     
    bein try
      begin tran majBase
     
      create ...
     
      GO
     
      create ...
     
      GO
     
      commit tran
    end try
    begin catch
      rollback tran
    end catch
    une solution ?
    (sql server 2005)

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    GO n'est en fait pas une instruction T-SQL mais une instruction OSQL et de son successeur SQLCMD.
    Elle permet plus généralement de marquer la fin d'un lot d'instructions aux utilitaires SQL Server, donc une transaction explicite ne peut pas contenir de GO.
    Avez-vous essayé avec GOTO en testant s'il y a eu erreur ?
    Peut-être aussi qu'en exécutant votre script avec SQLCMD vous pouvez gérer les erreurs.

    @++

  3. #3
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    le goto ne semble pas etre une solution, il est impossible d'enchainer 2 CREATE PROCEDURE sans GO (message : create procedure doit etre la seule instruction du lot)

    et donc pas de transaction autour possible, donc le goto ne résoud pas le problème


    pourtant là ou je bossais avant, il y avait des script de mise à jour qui était dans une transaction ... mais je ne me rappelle pas comment

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    il est impossible d'enchainer 2 CREATE PROCEDURE sans GO
    Exact, désolé

    pourtant là ou je bossais avant, il y avait des script de mise à jour qui était dans une transaction ... mais je ne me rappelle pas comment
    Avec sp_executeSQL ?

    @++

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    ah oui en mettant les requetes dans des varchar ...
    je pense pas que c'était comme ca où j'étais avant, mais ca devrait résoudre le problème

    par contre ca complique un peu enfin c'est moins lisible
    mais je vais tester ca vu que je vois pas d'autres solutions

  6. #6
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    en mettant les requetes dans des varchar
    NVARCHAR, car sp_executeSQL ne prend que l'Unicode

    @++

  7. #7
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    certes ^^


    bon je viens de tester, c'est moyennement efficace, enfin dans mon contexte

    GO est interdit dans sp_executesql

    et mes scripts sont obtenu depuis la dll SMO (.net) de sql server
    ca me permet pour des objets de générer des script sans me casser la tete, ca me donne par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SET ANSI_NULLS ON
    GO
     
    SET QUOTED_IDENTIFIER ON
    GO
     
    ALTER TRIGGER (...)
    et si je retire les GO, alter trigger rale qu'il n'est pas le premier dans le lot ...

  8. #8
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Vous pouvez faire un sp_executeSQL pour chaque objet, en testant la valeur de retour de sp_executeSQL ...

    @++

  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 865
    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 865
    Points : 53 018
    Points
    53 018
    Billets dans le blog
    6
    Par défaut
    C'est le TRY qui pose problème, car il interfère avec GO. Même problématique avec GOTO.

    Le plus simple est de faire du SQL dynamique et en sortie d'EXEC réagir en tuant la transaction.

    A +

  10. #10
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    si c'est le try, je vais tenter de faire

    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
    20
    21
    22
    23
    24
     
    begin tran
     
     
      create
     
      if @@error <> 0
         begin
           rollback tran
           return
         end
     
     
     
     
      create
     
      if @@error <> 0
         begin
           rollback tran
           return
         end
     
    commit tran

  11. #11
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    bon ca ne va pas non plus, un RETURN situé au dessus d'un GO fait que l'execution continue après le GO ...

    et puis avec @@error on a aucune info à part le message

Discussions similaires

  1. soucis avec des requetes "INNER JOIN" Imbriquées
    Par Moutonstar dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 13/11/2008, 12h12
  2. performance MySql avec des requetes complexes
    Par khadir dans le forum Requêtes
    Réponses: 3
    Dernier message: 04/12/2007, 16h40
  3. Réponses: 2
    Dernier message: 21/03/2007, 10h55
  4. Base de données: problème avec des requêtes et le caractère '
    Par faluorn dans le forum Général Python
    Réponses: 7
    Dernier message: 03/05/2006, 10h02
  5. probleme avec des requetes
    Par el_quincho dans le forum Access
    Réponses: 1
    Dernier message: 20/02/2006, 12h41

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