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 :

Exécuter du code construit dans une variable nvarchar()


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2010
    Messages : 258
    Par défaut Exécuter du code construit dans une variable nvarchar()
    MS SQL server 2008 R2.

    Bonjour,

    Je sèche sur le problème suivant:
    Je construis une instruction pour générer une requête pivot dans laquelle la liste des colonnes est variable (@CalibresNoms) et la date fournie en paramètre.

    Lorsque je veux exécuter ma variable j'obtiens une erreur suivante:
    Msg*203, Niveau*16, État*2, Ligne*38
    Le nom 'select … contenu de ma variable ...' n'est pas un identificateur valide.
    Pourtant, si je copie le texte de ma variable dans une nouvelle requête il s'exécute bien.
    Quelqu'un saurait-il d'où vient l'erreur ?

    Voici mon code:
    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
     
    declare
    	@Dt date='15/03/2019';
     
    declare @Calibres nvarchar(200)
    		, @CalibresNoms nvarchar(200)
    		, @DateStock nvarchar(50) = 'cast(''' + cast(@Dt as nvarchar(10)) +''' as date)'
    		, @Txt nvarchar(2000)
    		, @R int
    		;
    set @CalibresNoms='[0],[1],[2],[3+],[3],[4],[5],[6],[Long],[NT]';
     
    set @Txt=N'select IdLieu, IdP0, IdAppreciation, '  + @CalibresNoms 
    + N'
    FROM
    (
    	select ftP1.IdLieu, ftP1.IdP0, P1.IdAppreciation, PC13.Abrege as Calibre ,ftP1.NbUnites
    	from dbo.ft_P1_Stock_Date(' + @DateStock + N') ftP1 inner join 
    	P1_UNITES AS P1 ON ftP1.IdP1 = P1.IdP1 INNER JOIN
    	PC10_PRODUITS AS PC10 ON P1.IdProduit = PC10.IdPC10 INNER JOIN
    	dbo.PC13_TAILLES PC13 on PC10.IdTaille = PC13.IdPC13
    ) as Source
    PIVOT
    (
    	sum(source.NbUnites)
    	for source.Calibre in (' + @CalibresNoms + N')
    ) as LePivot
    '
    ;
    print @Txt;
    exec @Txt;
    et voici le contenu de la variable @Txt tel qu'il est renvoyé par l'instruction Print @Txt, Il s'exécute sans erreur dans une nouvelle fenêtre de requê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
     
    select IdLieu, IdP0, IdAppreciation, [0],[1],[2],[3+],[3],[4],[5],[6],[Long],[NT]
    FROM
    (
    	select ftP1.IdLieu, ftP1.IdP0, P1.IdAppreciation, PC13.Abrege as Calibre ,ftP1.NbUnites
    	from dbo.ft_P1_Stock_Date(cast('2019-03-15' as date)) ftP1 inner join 
    	P1_UNITES AS P1 ON ftP1.IdP1 = P1.IdP1 INNER JOIN
    	PC10_PRODUITS AS PC10 ON P1.IdProduit = PC10.IdPC10 INNER JOIN
    	dbo.PC13_TAILLES PC13 on PC10.IdTaille = PC13.IdPC13
    ) as Source
    PIVOT
    (
    	sum(source.NbUnites)
    	for source.Calibre in ([0],[1],[2],[3+],[3],[4],[5],[6],[Long],[NT])
    ) as LePivot

  2. #2
    Membre éclairé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2015
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 60
    Par défaut
    bonjour,

    essaie ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    exec sp_executesql @Txt

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2010
    Messages : 258
    Par défaut
    Excellent! Ca fonctionne bien.
    Un grand merci et bonne journée.

  4. #4
    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
    bonjour

    ou tout simplement exec (@Txt);

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

Discussions similaires

  1. exécuter le code contenu dans une variable
    Par casier dans le forum MATLAB
    Réponses: 2
    Dernier message: 07/11/2009, 00h43
  2. Récuperer code source dans une variable
    Par PKO06 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 27/03/2008, 16h22
  3. Réponses: 7
    Dernier message: 11/03/2007, 09h35
  4. [MySQL] code php dans une variable chaine php
    Par unmulot dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 11/07/2006, 10h48
  5. Mettre un code php dans une variable...
    Par kedare dans le forum Langage
    Réponses: 6
    Dernier message: 19/09/2005, 12h55

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