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