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 :

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


Sujet :

Développement SQL Server

  1. #1
    Membre confirmé
    Avatar de alheuredudejeuner
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2005
    Messages : 376
    Points : 632
    Points
    632
    Billets dans le blog
    4
    Par défaut Une instruction INSERT EXEC ne peut pas être imbriquée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        create table #V_Prix -- Prix renvoyer au demandeur
        (
        	Id_Transporteur varchar(20),Prix_HT numeric(15,4) ,Prix_Details varchar(100)
        )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            if @vT_Model ='France EX'
            BEGIN 
              insert into #V_Prix
              EXEC vulcain.CalculPrixFrance_EX  @ID_COURANT_Transporteur, @ID_Sites,
        		@R_Code_Postal, @R_CODE_PAYS, @L_Code_Postal, @L_Ville, @L_CODE_PAYS,
        		@Colis, @Poids, @Remboursement
              select * from #V_Prix
            END;
    Bonjour

    quelle est la bonne méthode ?

    cordialement

  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 758
    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 758
    Points : 52 537
    Points
    52 537
    Billets dans le blog
    5
    Par défaut
    Vous devez utiliser du SQL dynamique avec votre EXEC pour injecter le résultat dans le table.
    Pour cela utilisez EXEC ('mon sql dynamqie') ou sp_executeSQL.

    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 confirmé
    Avatar de alheuredudejeuner
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2005
    Messages : 376
    Points : 632
    Points
    632
    Billets dans le blog
    4
    Par défaut Échec de la conversion de la valeur varchar 'insert into #V_Prix EXEC vulcain.CalculPrixFrance_EX France EX, '
    Bonjour

    sans modèle de syntaxe, c'est compliquer d'imaginer la bonne écriture.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            	SET @My_SQL	= 'insert into #V_Prix EXEC vulcain.CalculPrixFrance_EX '  
                +@ID_COURANT_Transporteur+', '+@ID_Sites+', '
        		+@R_Code_Postal+', '+@R_CODE_PAYS+', '+@L_Code_Postal+', '+@L_Ville+', '+@L_CODE_PAYS+', '
        		+@Colis+', '+@Poids+', '+@Remboursement;/**/
            	EXEC(@My_SQL);
    Cordialement

  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 758
    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 758
    Points : 52 537
    Points
    52 537
    Billets dans le blog
    5
    Par défaut
    Je vous confirme, c'est assez chiant. Il faudrait voir toutes les informations et le code de toutes les SP. Peut être aussi pouvez vous utiliser une variable table....

    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
    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 : 42
    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,

    Alternativement, vous pouvez essayer :

    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
    INSERT INTO #V_Prix
    EXEC sp_executesql
    	N'EXEC vulcain.CalculPrixFrance_EX
    		@ID_COURANT_Transporteur
    		, @ID_Sites
    		, @R_Code_Postal
    		, @R_CODE_PAYS
    		, @L_Code_Postal
    		, @L_Ville
    		, @L_CODE_PAYS
    		, @Colis
    		, @Poids
    		, @Remboursement'
    	, N'@ID_COURANT_Transporteur <type>
    		, @ID_Sites <type>
    		, @R_Code_Postal <type>
    		, @R_CODE_PAYS <type>
    		, @L_Code_Postal <type>
    		, @L_Ville <type>
    		, @L_CODE_PAYS <type>
    		, @Colis <type>
    		, @Poids <type>
    		, @Remboursement <type>'
    	, @ID_COURANT_Transporteur = @ID_COURANT_Transporteur
    	, @ID_Sites = @ID_Sites
    	, @R_Code_Postal = @R_Code_Postal
    	, @R_CODE_PAYS = @R_CODE_PAYS
    	, @L_Code_Postal = @L_Code_Postal
    	, @L_Ville = @L_Ville
    	, @L_CODE_PAYS = @L_CODE_PAYS
    	, @Colis = @Colis
    	, @Poids = @Poids
    	, @Remboursement = @Remboursement
    Ce que je ne comprends pas, puisque comme le remarque SQLPro, nous n'avons pas le code de la procédure, c'est qu'en faisant le test suivant, je n'ai pas d'erreur :

    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
    34
    35
    CREATE PROCEDURE sub_test
    	@_low_bound smallint
    	, @_high_bound smallint
    AS
    BEGIN
    	SET NOCOUNT ON
     
    	SELECT	number
    	FROM	master.dbo.spt_values
    	WHERE	type = 'P'
    	AND	number BETWEEN @_low_bound AND @_high_bound
    END
    GO
     
    CREATE PROCEDURE test
    	@_low_bound smallint
    	, @_high_bound smallint
    AS
    BEGIN
    	SET NOCOUNT ON
     
    	EXEC dbo.sub_test
    		@_low_bound
    		, @_high_bound
    END
    GO
     
    CREATE TABLE #T
    (
    	i smallint
    )
     
    INSERT INTO #T
    EXEC dbo.test 5, 250
    GO
    @++

  6. #6
    Membre confirmé
    Avatar de alheuredudejeuner
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2005
    Messages : 376
    Points : 632
    Points
    632
    Billets dans le blog
    4
    Par défaut if else
    Bonjour

    dans une procédure précédente ou j'ai eu le même souci j'ai remonté le code d'un niveau.
    Ce qui bloquait était les if de la procédure appelée.

    cordialement

  7. #7
    Membre confirmé
    Avatar de alheuredudejeuner
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2005
    Messages : 376
    Points : 632
    Points
    632
    Billets dans le blog
    4
    Par défaut La variable scalaire "@ID_COURANT_Transporteur" doit être déclarée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DECLARE @ID_COURANT_Transporteur varchar(20)
    Il ya des choses que je ne comprends pas dans le code ex1 de Elsuket

    a/ le N devant les guillemets
    b/ les variables sont utilisées 3 fois dans la commande.

    une fois normale, une fois suivie de <type> et une autre fois égales à elles même.

    Pouvez-vous m'expliquer.

    le code compile, mais ne s’exécute pas.

    Cordialement

    PS le N, je le retrouve dans beaucoup d'exemple.

  8. #8
    Membre confirmé
    Avatar de alheuredudejeuner
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2005
    Messages : 376
    Points : 632
    Points
    632
    Billets dans le blog
    4
    Par défaut point mort
    Une instruction INSERT EXEC ne peut pas être imbriquée.

    j'ai remplacé le type par le bon type, et je reviens à la case départ.

    Je me demande comment résoudre ce souci.

    1/ mettre le résultat de la procédure stockée niveau inférieur dans une table en dur
    2/ Ecrire mes procédures sur un seul niveau
    3/ autres ?

    cordialement

  9. #9
    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 : 42
    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
    Les N avant les guillemets permet de spécifier que la chaîne est à interpréter en Unicode, ce que la procédure stockée système sp_executesql attend.
    En ce qui concerne les variables :

    • Elles sont utilisées une première fois pour réaliser l'appel de votre procédure stockée, qui les attend
    • Puis on doit les déclarer pour les passer à la procédure stockée sp_executesql
    • Et enfin on doit passer les variable de votre procédure stockée à l'appel sp_executesql


    Le substitut <type> indique qu'il faut spécifier le type de données de la variable : je n'ai pas pu le faire, puisque vous n'avez pas fourni la déclaration des variables.

    @++

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/03/2014, 14h34
  2. Réponses: 10
    Dernier message: 09/08/2012, 16h50
  3. Réponses: 3
    Dernier message: 22/10/2010, 00h18
  4. Réponses: 4
    Dernier message: 18/05/2009, 19h15
  5. Erreur : Le champ ne peut pas être une chaîne vide
    Par supertoms dans le forum VBA Access
    Réponses: 5
    Dernier message: 23/04/2008, 07h05

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