2014-01-06 6 views
0

У меня возникла проблема в следующем SQL-запросе. Когда я выполняю этот запрос без условия, в котором он работает нормально ... но когда я использую, где условие не работает, оно дает следующее сообщение об ошибке ..Где условие в sql PIVOT

Msg 137, Level 15, State 2, Line 4 Должен объявить скалярную переменную «@ courseid1».

ALTER PROCEDURE [dbo].[SP_Attendance] 
    @courseid as int=null, @subjid int=null 
AS 

Declare @colList varchar(max) 
Declare @qry varchar(max) 

Declare @courseid1 as [email protected], 
@subjid1 [email protected] 

SET @colList = STUFF((SELECT distinct ',' + QUOTENAME(SA.Attend_Date) 
      FROM Student_Attendance_Sheet SA 
      FOR XML PATH(''), TYPE 
      ).value('/', 'NVARCHAR(MAX)') 
     ,1,1,'') 

SET @qry = 'SELECT Roll_No, EnrollmentNo, STUD_FNAME + STUD_MNAME + STUD_LNAME as [Student Name] , '[email protected]+' 
FROM (
    select SA.Roll_No, SA.Attend_Date, SA.Attendance from Student_Attendance_Sheet SA 
    where (SA.Course_ID = [email protected]+) and (SA.Subject_ID = [email protected]+) 
) as s 
PIVOT 
(
    MAX(Attendance) 
    FOR Attend_Date IN (' + @colList + ') 
) pvt ' 
print(@qry) 
Exec(@qry) 

Exec SP_Attendance 2, 3

Еще одна вещь .. когда я использую, когда условие в

SET @colList = STUFF((SELECT distinct ',' + QUOTENAME(SA.Attend_Date) 
      FROM Student_Attendance_Sheet SA 
where (SA.Course_ID = [email protected]+) and (SA.Subject_ID = [email protected]+) 
      FOR XML PATH(''), TYPE 
      ).value('/', 'NVARCHAR(MAX)') 
     ,1,1,'') 

Он работает, но нет фильтрации .. так что я должен использовать, где состояние вышеупомянутым образом ... Пожалуйста, помогите мне решить эту проблему ... Спасибо

ответ

0

Я предлагаю вам .. не создавать больше переменных без необходимости .. это занимает ур пространство памяти Вы просто пойти с ...

ALTER PROCEDURE [dbo].[SP_Attendance] 
    @courseid as int=null, @subjid int=null 
AS 

Declare @colList varchar(max) 
Declare @qry varchar(max) 

SET @colList = STUFF((SELECT distinct ',' + QUOTENAME(SA.Attend_Date) 
      FROM Student_Attendance_Sheet SA 
      where Course_ID= @courseid AND Subject_ID = @subjid 
      FOR XML PATH(''), TYPE 
      ).value('/', 'NVARCHAR(MAX)') 
     ,1,1,'') 

SET @qry = 'SELECT Roll_No, EnrollmentNo, STUD_FNAME + STUD_MNAME + STUD_LNAME as [Student Name] , '[email protected]+' 
FROM (
    select Roll_No, EnrollmentNo, STUD_FNAME, STUD_MNAME, STUD_LNAME, Attend_Date, Attendance from Student_Attendance_Sheet 
    where (Course_ID = '+cast(@courseid as varchar(50))+ ') and (Subject_ID = '+cast(@subjid as varchar(50))+ ') 
) as s 
PIVOT 
(
    MAX(Attendance) 
    FOR Attend_Date IN (' + @colList + ') 
) pvt ' 
print(@qry) 
Exec(@qry) 

Попробуйте это ..

0

Проблема с вашим существующим запросом - это ваши переменные @courseid1 и @subjid1 не определены в вашем динамическом SQL, поэтому они не входят в сферу действия.

Один из способов, которые вы можете исправить это будет конкатенации строковых значений переменной в вашей SQL строки:

SET @qry 
    = 'SELECT Roll_No, EnrollmentNo, 
     STUD_FNAME + STUD_MNAME + STUD_LNAME as [Student Name] , '[email protected]+' 
    FROM 
    (
     select SA.Roll_No, SA.Attend_Date, SA.Attendance 
     from Student_Attendance_Sheet SA 
     where (SA.Course_ID = '+cast(@courseid1 as varchar(50))+ ') 
      and (SA.Subject_ID = '+cast(@subjid1 as varchar(50))+ ') 
    ) as s 
    PIVOT 
    (
     MAX(Attendance) 
     FOR Attend_Date IN (' + @colList + ') 
    ) pvt ' 
print(@qry) 
Exec(@qry) 

Другой способ написать приведенный выше запрос будет sp_executesql и вы пройдете в вашем значения параметров:

DECLARE @ParmDefinition nvarchar(500); 
SET @ParmDefinition = N'@courseid1 int, @subjid1 int'; 


SET @qry 
    = 'SELECT Roll_No, EnrollmentNo, 
     STUD_FNAME + STUD_MNAME + STUD_LNAME as [Student Name] , '[email protected]+' 
    FROM 
    (
     select SA.Roll_No, SA.Attend_Date, SA.Attendance 
     from Student_Attendance_Sheet SA 
     where (SA.Course_ID = @courseid1) 
      and (SA.Subject_ID = @subjid1) 
    ) as s 
    PIVOT 
    (
     MAX(Attendance) 
     FOR Attend_Date IN (' + @colList + ') 
    ) pvt ' 

EXECUTE sp_executesql @qry, 
    @ParmDefinition, 
    @courseid1 = @courseid, 
    @subjid1 = @subjid; 

насколько ваш второй вопрос с пунктом WHERE, вы должны написать запрос, чтобы создать список имен, подобных:

SET @colList 
    = STUFF((SELECT distinct ',' + QUOTENAME(SA.Attend_Date) 
      FROM Student_Attendance_Sheet SA 
      where (SA.Course_ID = @courseid1) 
       and (SA.Subject_ID = @subjid1) 
      FOR XML PATH(''), TYPE 
      ).value('/', 'NVARCHAR(MAX)') 
     ,1,1,'') 
Смежные вопросы