2015-09-21 6 views
1

Я проверил this и this, но я потерян.Как объявить переменные в динамических столбцах в SQL Server 2005 с использованием PIVOT

По какой-то причине я не могу объявить переменные @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 и передать Params в –

+0

@MitchWheat Как вы имеете в виду? Где я должен поместить вызов «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