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 :

Executer une procédure stokées dans un INSERT


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Par défaut Executer une procédure stokées dans un INSERT
    Bonjour,

    Je suis actuellement en train de créer une procédure stockée permettant un insertion.
    Hors pour l'une des colonnes de mon insertion, je voudrais récupérer la sortie d'une autre insertion existante.
    Cela donne un code de la manière suivante (en très très simplifié):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    insert into MATABLE(Cle, newCleEtrangere, Nom)
    select newId(), (Exec InsertNewCleEtrangere @param1 = monParam1, @param2 = monParam2), Table2.nom From Table2
    La procédure 'InsertNewCleEtrangere' insert une nouvelle clé étrangère en base, et me la retourne en sortie.

    Mon problème est que je ne trouve pas la syntaxe adéquate pour permettre cette exécution dans mon insertion.

    Merci d'avance.

  2. #2
    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
    En effet, vous ne pouvez pas procéder ainsi.

    la seuls façon d'insérer le résultat d'un procédure stockée dans une table est celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    INSERT INTO UnTable
        EXEC UneProcedure UnParametre
    C'est assez contraignant...
    Par ailleurs, d'après l'exemple que vous donnez, il semble que vous utilisiez le retour de la procédure stockée pour récupérer l'ID inséré. C'est une mauvaise pratique, le code de retour étant supposé renvoyer une éventuelle erreur.
    Pour renvoyer des données, utilisez un paramètre OUTPUT, ou un jeu de résultat (seule méthode fonctionnant d'ailleurs avec le code ci-dessus)


    Je pense toutefois qu'il faudrait revoir votre processus dans son ensemble. Que fait-il ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Par défaut
    En fait, ma table possède 2 clé référence sur elle même (un page (ma table), avec une entête et un pied de page qui sont des 'page' (les 2 références sur elle même))
    Je possède un table que l'on va appeler 'modelePage' qui est la même, sauf qu'elle est utiliser pour des modèles de page. Chaque modèle créer à partir d'un 'modelePage' possède une cleModelePage.

    Je souhaite créer une page à partir d'un 'MODELEPAGE' une page. (en regardant les réféences cleModelePage pour mon cas).
    J'arrive avec un code comme 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
     
    insert into FORMULAIRE
    	(Cle, ,CleEntetePage,ClePiedPage, strNom, CleModelePage)
    OUTPUT Inserted.Cle
    select newId(), 
             case when MODELEPAGE.CleEnTetePage  is null then null --pas d'entete, ne rien faire
    		  when entetePage.Cle is null then  --Creation de la page Entete : appelle de moi même (procédure stocké d'insertion)
    	          else entetePage.Cle --ajout de l'entete existant
    	 end,
    	 case when MODELEPAGE.ClePiedPage  is null then null --pas de pied de page, ne rien faire
    		  when PiedPage.Cle is null then  --Creation du Pied de page : appelle de moi même (procédure stocké d'insertion)
    	 else PiedPage.Cle --ajout du pied de page existant
    	 end,
             MODELEPAGE.strNom, MODELEPAGE.Cle
    left outer join PAGE entetePage on entetePage.CleModelePage = MODELEPAGE.CleEnTetePage 
    left outer join PAGE as PiedPage on PiedPage.CleModelePage = MODELEPAGE.ClePiedPage
    where MODELEPAGE.cle = @CleModelePage
    Y'a t'il selon vous une autre manière de procéder ?

  4. #4
    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
    que fait exactement ta proc stock ? si possible peux tu nous donner le code ??

    Car pour mois elle devrait plus être remplacer par une fonction qui renvoie une valeur mais c'est de la pure spéculation car je ne sais pas ce que fait ta store proc d'insertion ....

  5. #5
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Moi je partirais plutôt sur la piste d'un trigger qui exécute la procédure stockée sur commande insert.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Par défaut
    Actuellement, voici ma procédure complète :

    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
    Alter PROCEDURE [dbo].[FORMULAIRE_InsertFromCleFormulaireBaseCleSituation]
    	@CleFormulaireBase uniqueidentifier,
    	@CleSituation uniqueidentifier
    AS
    BEGIN
     
     
    insert into FORMULAIRE
    	(Cle, CleSituation,CleEntetePage,ClePiedPage, strNom, strRole, strDescription, xmlFormulaire, blnActif,imgApercu,intFavoris,strPath,blnModifiable,intMajor,intMinor,CleFormulaireBase)
    OUTPUT Inserted.Cle
    select newId(), @CleSituation,
         case when FORMULAIREBASE.CleEnTetePage  is null then null --pas d'entete, ne rien faire
    		  when entetePageForm.Cle is null then newID()   --Creation formulaireEntete
    	 else entetePageForm.Cle --ajout du formulaire entete existant
    	 end,
    	 case when FORMULAIREBASE.ClePiedPage  is null then null --pas de pied de page, ne rien faire
    		  when PiedPageForm.Cle is null then (EXEC [dbo].[FORMULAIRE_InsertFromCleFormulaireBaseCleSituation] @CleFormulaireBase=FORMULAIREBASE.ClePiedPage, @CleSituation='D8C67176-17AA-4679-92E1-D15E7E06EF18')    --Creation formulairePied
    	 else PiedPageForm.Cle --ajout du formulaire pied de page existant
    	 end,
    	FORMULAIREBASE.strNom, FORMULAIREBASE.strRole, FORMULAIREBASE.strDescription, FORMULAIREBASE.xmlFormulaire,
    	1,FORMULAIREBASE.imgApercu, 0,FORMULAIREBASE.strPath,FORMULAIREBASE.blnModifiable,FORMULAIREBASE.intMajor,0, FORMULAIREBASE.Cle
    from FORMULAIREBASE 
    left outer join Formulaire as entetePageForm on entetePageForm.CleFormulaireBase = FORMULAIREBASE.CleEnTetePage and entetePageForm.cleSituation = @CleSituation
    left outer join Formulaire as PiedPageForm on PiedPageForm.CleFormulaireBase = FORMULAIREBASE.ClePiedPage and PiedPageForm.cleSituation = @CleSituation
    where FORMULAIREBASE.cle = @CleFormulaireBase
    END

    ma procédure me permet de créer un formulaire depuis un formulaire base (modèle). Ensuite elle regarde si le formulaire base possède des entêtes et pied de page. Si il possède pas d'entête, le formulaire n'aura pas d'entête, si elle possède un entête, elle regarde si il existe un formulaire pour dépendant de l'EnteteBase pour la situation '@CleSituation'. Si il existe, on ajoute sa référence au formulaire créer, sinon on créer le formulaire entête pour la situation '@CleSituation' (appelle de la même procédure stocké avec en parametre 'CleEnteteBase' et '@clesituation', et on ajoute la cle du nouveau entête de page créer au formulaire que l'on souhaite créer. On fait de même pour les pieds de pages.

    Ici formulaire = page dans mon explication précédente.

    Est ce que mes explications sont claire ? Si vous avez besoin de plus de détail pour comprendre, n'hésitez pas.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Par défaut
    Pour le trigger, je ne maitrise pas forcément la chose . Mais étant possible de le créer sans qu'il y ait de référence au formulaireBase, cela ne gênera pas ?

Discussions similaires

  1. erreur en l'execution d'une procédure existant dans un Addin?
    Par said2n dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/11/2008, 19h23
  2. Réponses: 1
    Dernier message: 13/06/2006, 17h41
  3. Réponses: 3
    Dernier message: 17/01/2006, 17h12
  4. Pb pour executer une procédure sous SQL PLUS
    Par rabddoul dans le forum Oracle
    Réponses: 4
    Dernier message: 21/10/2005, 15h40
  5. Réponses: 5
    Dernier message: 30/06/2005, 10h28

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