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

Développement SQL Server Discussion :

Procédure stockée et multiples insert [2008]


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 200
    Points : 65
    Points
    65
    Par défaut Procédure stockée et multiples insert
    Bonjour j'ai deux soucis avec une procédure stockée dont j'ai hérité
    Je me permet de prévenir que je ne suis pas dev donc les questions que je vais poser ont peut-être des réponses évidentes

    La procédure stockée ressemble à ceci :

    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 procedure XXX @id varchar(50)
    as 
    begin
    insert into table_de_log (datemaj) values (@id)
    begin try
    begin tran
     
    truncate T1
    truncate T2
    truncate ...
    ... T20
     
    insert into T1 select * from TT1
    insert into T2 select * from TT2
    insert into ...
    ... from TT20
     
    commit tran
    update table_de_log  set isactive=0,Status=0 where datemaj=@id
    end try
    begin catch
    update table_de_log set isactive=0,errmsg=convert(vachar(50),error_number())+'-'+convert(varchar(5),error_line())+'-'+error_message() where datemaj=@id
    end catch;
    end;
    Mon premier pb : lors de la phase de tests nous avons simulé différentes erreurs et avons ajouté un insert sur une table inexistante : si la table n'existe pas la procédure se stop immédiatement, j'aimerais donc trouver un moyen de finir la procédure stockée quoiqu'il arrive et de voir ensuite la ou les erreurs

    Second problème : par moment la procédure plante l'instance de BDD pourant le nombre de lignes traitées au total est des plus raisonnable, est-il possible et intelligent (si c'est possible) d'ajouter des commit après chaque insert ?

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    1) Vous ne devez pas placer de code entre le END TRY et le BEGIN CATCH

    2) vous ne terminez pas un END CATCH

    3) votre contrôle transactionnel est mal placé

    4) il vous faut renvoyer un code d'erreur si passage dans le CATCH.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 200
    Points : 65
    Points
    65
    Par défaut
    Merci de votre réponse
    1- Je n'en vois pas
    2 et 4- Si mais je ne l'ai pas recopié (du coup j'edit le premier post)
    3-pourriez vous précisez en quoi il est mal placé ?

    Qu'en est-il des commits à votre avis ?
    Comment faire en sorte qu'il aille au bout de la procédure même si il y a une erreur dans un des 20 inserts ?

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    Voici quel est le squelette de code correct :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    CREATE procedure P ...
    AS
     
    -- code non transactionné
     
    BEGIN TRANSACTION
     
    -- code transactionné
     
    BEGIN TRY
     
    -- code vérifié
     
     
       COMMIT --> finalisation de la transaction par validation
     
    END TRY
    --> AUCUN code ne doit figurer END TRY et BEGIN CATCH
    BEGIN CATCH
       IF XACT_STATE() <> 0 
          ROLLBACK --> finalisation de la transaction par annulation,
     
    -- code de gestion d'erreur
     
       RAISERROR('Traitement transactionnel annulé dans la procédure P.', 16, 1); --> renvoi d'un code d'erreur
     
    -- code non transactionné suite à erreur
     
    END CATCH
     
    -- code non transactionné final
     
    GO
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 200
    Points : 65
    Points
    65
    Par défaut
    J ai suivi vos conseils et ai crée 2 procédures stockées

    une avec les truncate insert
    et la seconde qui lance la premiere avec le try/catch

    C'est effectivement mieux, ma procédure ne se stop pas en plein vol mais ne va pas après une eventuelle erreur

    y a til un moyen cependant de commiter les insert les uns après les autres ?

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Guigsounet Voir le message
    J ai suivi vos conseils et ai crée 2 procédures stockées

    une avec les truncate insert
    et la seconde qui lance la premiere avec le try/catch

    C'est effectivement mieux, ma procédure ne se stop pas en plein vol mais ne va pas après une eventuelle erreur

    y a til un moyen cependant de commiter les insert les uns après les autres ?
    Vous n'êtes pas cohérent, Si vous voulez une transaction, alors le COMMIT et le ROLLBACK doit se faire globalement.
    Si vous voulez valider à chaque instruction SQL, alors il ne faut pas gérer de transaction explicite.

    Bref, il y a quelque chose qui tourne pas rond dans votre tête !

    Si au lieux de nous fournir un exemple théorique, incomplet et syntaxiquement incohérent vous nous fournissiez le vrai code ce serait peut être plus intéressant ne croyez vous pas ???

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 200
    Points : 65
    Points
    65
    Par défaut
    C'était le vrai code édulcoré des 20 truncate et 20 insert

    Quant à ma tête tout va bien comme je l'ai dis je ne suis ni dev ni a l origine de cette procédure
    Apparemment vous n'êtes pas du matin

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

Discussions similaires

  1. Procédure stockée pour l'insertion d'un cv dans une base de données
    Par o.abdelmalek13 dans le forum Développement
    Réponses: 2
    Dernier message: 28/05/2012, 16h50
  2. procédure stockée insert multiple
    Par gigi34 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/09/2005, 10h37
  3. [Procédure stockée]Insert avec renvoi clé primaire?
    Par busmik dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 26/08/2004, 16h14
  4. INSERT avec procédure stockée / Clef de type AutoInc
    Par bgdelphi dans le forum Bases de données
    Réponses: 5
    Dernier message: 18/10/2003, 18h30
  5. Procédure stocké:Insert et renvoie de la clé primair
    Par caramel dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 17/04/2003, 09h34

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