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:
Citation:
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.:ptdr:
Quelqu'un saurait-il d'où vient l'erreur ?
Voici mon code:
Code:
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:
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 |