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:
Pourtant, si je copie le texte de ma variable dans une nouvelle requête il s'exécute bien.Msg*203, Niveau*16, État*2, Ligne*38
Le nom 'select … contenu de ma variable ...' n'est pas un identificateur valide.
Quelqu'un saurait-il d'où vient l'erreur ?
Voici mon code:
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
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;
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
Partager