2014-05-01 3 views
0

J'ai un PIVOT dynamique qui fonctionne partiellement. Cela fonctionne quand je ne demande pas une clause where en utilisant une variable mais juste en utilisant un nombre spécifique. Je veux aussi être capable de stocker les résultats dans une table temporaire.Stockage de variables dynamiques en table temporaire et erreur variable

Est-il possible d'avoir une variable clause where dans un pivot dynamique et est-il possible d'enregistrer les résultats dans une table temporaire?

Voici ma requête en cours qui ne fonctionne pas

declare @CourseID int = 2 
DECLARE 
    @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(UnitID) 
      FROM LMS_Unit_Status where CourseID = @CourseID 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT LearnerID, ' + @cols + ' from 
      (select LearnerID,UnitID,Completed from LMS_Unit_Status where CourseID = @CourseID) as s 
      pivot 
      (
       min(Completed) 
       for UnitID in (' + @cols + ') 
      ) p' 
execute(@query); 

Msg 137, Level 15, State 2, Line 2 
Must declare the scalar variable "@CourseID". 

Merci

Répondre

0

Si @CurseID est un analyseur variable doit savoir qu'il est une variable et non une chaîne

Et puisque vous avez aucune idée du nombre de colonnes que vous pouvez utiliser, vous pouvez simplement utiliser select into.

set @query = 'SELECT LearnerID, ' + @cols + ' into tempTable from 
      (select LearnerID,UnitID,Completed from LMS_Unit_Status where CourseID = ' + @CourseID + ') as s 
      pivot 
      (
       min(Completed) 
       for UnitID in (' + @cols + ') 
      ) p 
select * from tempTable 
drop table tempTable' 
execute(@query); 

Cheers!

+0

Merci @Arek - j'ai essayé, mais je reçois le message 'Msg 245, niveau 16, état 1, ligne 12 La conversion a échoué lors de la conversion de la valeur nvarchar « SELECT LearnerID, [CU2306] dans #UnitReport de (sélectionnez LearnerID, UnitID, Completed à partir de LMS_Unit_Status où CourseID = 'au type de données int.' – gillers322

Questions connexes