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 :

Appel d'une procédure stockée à partir d'une 2eme qui appelle une 3eme


Sujet :

MS SQL Server

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 39
    Points : 29
    Points
    29
    Par défaut Appel d'une procédure stockée à partir d'une 2eme qui appelle une 3eme
    Bonjour à tous,
    Je suis confrontée à un problème d'appel d'une procédure stockée à partir d'une autre, qui elle appelle une 3ème.

    [dbo].[P_TEST_P1] ==> [dbo].[P_TEST_P2]==> [dbo].[P_TEST_TABLE]

    L'exécution de la procédure [dbo].[P_TEST_P2] qui appelle [dbo].[P_TEST_TABLE] fonctionne sans problème. Mais lorsque j'exécute [dbo].[P_TEST_P1], j'obtiens l'erreur:

    "P_TEST_P2 Insert Error: Column name or number of supplied values does not match table definition."

    Or je pense que ce n'est pas un problème de nom ou du nombre de colonne. Car il suffit que dans la procédure P_TEST_P1 je remplace P_TEST_P2 par P_TEST_TABLE et ça fonctionne. Mon problème est donc celui d'appel de procédure stockée au 3ème niveau.

    Merci pour toute aide.


    1. Procédure de base ([dbo].[P_TEST_TABLE])


    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
    CREATE PROCEDURE [dbo].[P_TEST_TABLE]
     
    	@p_SqlMessageRetour	nvarchar(256) = '' output
    AS
     
    SET XACT_ABORT ON;
    SET NOCOUNT ON;
     
    BEGIN TRY
     
    		CREATE TABLE #T_PERIODE(IdPeriode int,Mois nvarchar(20))
     
    		INSERT INTO #T_PERIODE (IdPeriode,mois)	VALUES (1,'Janvier')
    		INSERT INTO #T_PERIODE (IdPeriode,mois)	VALUES (2,'Février')
     
    		SELECT * FROM #T_PERIODE		
     
    		IF OBJECT_ID(N'[TEMPDB].[dbo].[#T_PERIODE]', N'U') IS NOT NULL DROP TABLE #T_PERIODE ;
     
    	RETURN 0
     
    END TRY
    BEGIN CATCH
    		SET @p_SqlMessageRetour=ISNULL(error_procedure(),'') + ' ' + ISNULL(error_message(),'');
    		SELECT @p_SqlMessageRetour;
    		RETURN ISNULL(error_number(),1);
    END CATCH
    1. Procédure de base ([dbo].[P_TEST_P2])

    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
    CREATE PROCEDURE [dbo].[P_TEST_P2]
    	@p_SqlMessageRetour	nvarchar(256) = '' output
    AS
     
    SET XACT_ABORT ON;
    SET NOCOUNT ON;
     
    BEGIN TRY
     
    		CREATE TABLE #T_PERIODE(IdPeriode int , Mois nvarchar(20))
     
    		INSERT INTO #T_PERIODE EXECUTE [dbo].[P_TEST_TABLE] @p_SqlMessageRetour OUTPUT
     
    		SELECT * FROM #T_PERIODE
     
    		IF OBJECT_ID(N'[TEMPDB].[dbo].[#T_PERIODE]', N'U') IS NOT NULL DROP TABLE #T_PERIODE ;
     
    	RETURN 0
     
    END TRY
    BEGIN CATCH
    		SET @p_SqlMessageRetour=ISNULL(error_procedure(),'') + ' ' + ISNULL(error_message(),'');
    		SELECT @p_SqlMessageRetour;
    		RETURN ISNULL(error_number(),1);
    END CATCH
    1. Procédure de base ([dbo].[P_TEST_P1])

    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
    CREATE PROCEDURE [dbo].[P_TEST_P1]
    	@p_SqlMessageRetour	nvarchar(256) = '' output
    AS
     
    SET XACT_ABORT ON;
    SET NOCOUNT ON;
     
    BEGIN TRY
     
    		CREATE TABLE #T_PERIODE(IdPeriode int , Mois nvarchar(20))
     
    		INSERT INTO #T_PERIODE EXECUTE [dbo].[P_TEST_P2] @p_SqlMessageRetour OUTPUT
     
    		SELECT * FROM #T_PERIODE
     
    		IF OBJECT_ID(N'[TEMPDB].[dbo].[#T_PERIODE]', N'U') IS NOT NULL DROP TABLE #T_PERIODE ;
     
    	RETURN 0
     
    END TRY
    BEGIN CATCH
    		PRINT 'TEST'
    		SET @p_SqlMessageRetour=ISNULL(error_procedure(),'') + ' ' + ISNULL(error_message(),'');
    		SELECT @p_SqlMessageRetour;
    		RETURN ISNULL(error_number(),1);
    END CATCH

  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,

    Il suffit de ne pas CATCHer l'erreur comme vous l'avez fait, et on trouve :

    Une instruction INSERT EXEC ne peut pas être imbriquée.
    @++

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 39
    Points : 29
    Points
    29
    Par défaut
    Bonjour elsuket et merci pour votre réponse.
    Je reçois effectivement l'erreur selon laquelle l'instruction INSERT EXEC ne peut être imbriquée.
    Comment peut on donc contourner ce problème?
    Merci pour toute indication.

  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
    Cela ne semble pas faisable à priori.

    Pouvez-vous nous dire pourquoi vous avez besoin d'effectuer une telle implémentation ?
    Également, pourquoi vous utilisez des tables temporaires (est-ce seulement pour l'exemple) ?
    Ne pouvez-vous pas utiliser seulement qu'une seule procédure stockée ?

    @++

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 39
    Points : 29
    Points
    29
    Par défaut
    En fait, je suis obligée de faire une telle implémentation pour question de maintenance.
    Voici à quoi ressemble mon architecture:
    J'ai plusieurs procédures de 1er niveau de type [dbo].[P_TEST_P1] (P1_1, P1_2, P1_3, ...).
    Ensuite, j'ai plusieurs procédures de 2ème niveau de type [dbo].[P_TEST_P2] (P2_1, P2_2, P2_3, ...).
    Enfin des procédures de derniers niveau de type [dbo].[P_TEST_P3] (P3_1, P3_2, P3_3, ...)
    • Les procédures de 3ème niveau retournent un résulat intermédiaire nécessaire pour l'exécution des procédures de 2ème niveau

    • Les procédures de 2ème niveau retournent un résulat intermédiaire nécessaire pour l'exécution des procédures de 1er niveau

    • Les procédures de 1er niveau retournent un résulat final


    Si à chaque niveau, on n'avait qu' UNE ou à la limite 2 procédures, j'aurais écrit une seule procédure quit à dupliquer le code. Le malheur est que nous avons à chaque niveau plusieurs procédures et des possibilités de scénarios d'appel suivants:
    P1_1==>P2_1==>P3_1
    P1_2==>P2_1==>P3_3
    P1_1==>P2_2==>P3_1
    P1_3==>P2_1==>P3_1
    P1_1==>P2_2==>P3_2
    P1_3==>P2_3==>P3_1
    P1_1==>P2_3==>P3_2
    ...
    S'il me faut alors rammener mon architecture à un seule niveau, alors, ça sera bien fait pour moi pour la duplication du code, et par conséquent pour la maintenance.
    D'autre part, les procédures intermédiaires (2ème et 3ème niveau) sont si complexes qu'il m'est impossible d'utiliser les fonctions qui aurait résolu le problème.

    Merci

  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
    Je crois surtout qu'il s'agit d'un problème de modélisation de votre base de données.
    Dans la plupart des cas, si le modèle a été conçu dans les règles et avec parcimonie, toute requête s'exprime au moins assez simplement.

    @++

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 39
    Points : 29
    Points
    29
    Par défaut
    Bonsoir et merci pour votre réponse.
    Je suis mal placée pour savoir si la base de données a été bien modélisée ou pas.
    il s'agit d'une appli qui a été conçue depuis longtemps et je dois l'évoluer et la maintenir.
    J'ai pu contourner mon problème en créant des tables de travail qui sont chargées à l'exécution de l'appli et de nouveau vidées à la fin. Ces tables contiennent ainsi les résultats des procédures de niveau 2 et 3.
    Les procédures de niveau 1 accèdent UNIQUEMENT à ces tables de travail.
    Merci pour votre aide

Discussions similaires

  1. Réponses: 6
    Dernier message: 22/12/2011, 16h26
  2. Réponses: 0
    Dernier message: 11/09/2009, 18h25
  3. Exécuter une procédure stockée à partir de vb.net
    Par anihak80 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 06/01/2008, 12h46
  4. Réponses: 3
    Dernier message: 10/04/2007, 13h53
  5. Comment creer une procédure stockée à partir d'un code VBA?
    Par Alcor020980 dans le forum Connexion aux bases de données
    Réponses: 4
    Dernier message: 24/05/2005, 19h55

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