2015-09-21 46 views
1

我已經簽出thisthis,但我迷路了。如何使用PIVOT在SQL Server 2005的動態列中聲明變量

由於某些原因,我無法聲明@wsDateFrom & @wsDateTo在以下動態列SQL代碼中使用的變量。

DECLARE @cols AS NVARCHAR(MAX), 
     @query AS NVARCHAR(MAX) 

DECLARE @wsDateFrom AS smalldatetime 
DECLARE @wsDateTo AS smalldatetime 

SET @wsDateFrom = '01-JAN-2015' 
SET @wsDateTo = '30-JUN-2015' 

select @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(a.AbsenceDescription) 
         FROM dbo.tblAbsentCodes AS a 
         FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'') 

set @query = N'SELECT StudentID, ' + @cols + 
      'FROM (SELECT a.StudentID, ab.AbsenceDescription, a.AttendanceID 
        FROM dbo.tblAttendance AS a 
         INNER JOIN tblCalendar c 
          ON a.DateID = c.DateID 
         INNER JOIN tblAbsentCodes as ab 
          ON ab.AbsenceID = a.AbsenceID 
        WHERE c.DayDate BETWEEN @wsDateFrom AND @wsDateTo) AS p 
       PIVOT (COUNT(AttendanceID) FOR AbsenceDescription IN (' + @cols + ')) AS pvt ' 

execute(@query) 

我得到的錯誤是

必須聲明標量變量 「@wsDateFrom」。

但它在那裏!或者我應該把@ DECLARE放在@query裏面?

如果是這種情況,那麼我將如何在函數或存儲過程中傳遞這兩個日期變量?它會打開它的SQL注入不是嗎?

+0

使用sp_executesql的,並通過在 –

+0

@MitchWheat PARAMS你什麼意思?我應該在哪裏放置「sp_executesql」調用?此外,我仍然必須聲明上述的參數。 – Fandango68

回答

2

不,它不在那裏。 試試這個:

DECLARE @cols AS NVARCHAR(MAX), 
     @query AS NVARCHAR(MAX) 

DECLARE @wsDateFrom AS smalldatetime 
DECLARE @wsDateTo AS smalldatetime 

SET @wsDateFrom = '01-JAN-2015' 
SET @wsDateTo = '30-JUN-2015' 

select @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(a.AbsenceDescription) 
         FROM dbo.tblAbsentCodes AS a 
         FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'') 

set @query = N'SELECT StudentID, ' + @cols + 
      'FROM (SELECT a.StudentID, ab.AbsenceDescription, a.AttendanceID 
        FROM dbo.tblAttendance AS a 
         INNER JOIN tblCalendar c 
          ON a.DateID = c.DateID 
         INNER JOIN tblAbsentCodes as ab 
          ON ab.AbsenceID = a.AbsenceID 
        WHERE c.DayDate BETWEEN ' + @wsDateFrom + 'AND ' + @wsDateTo + ') AS p 
       PIVOT (COUNT(AttendanceID) FOR AbsenceDescription IN (' + @cols + ')) AS pvt ' 

execute(@query) 
+0

是的!當然。 Dogh。謝謝 – Fandango68