2014-01-06 3 views
0

다음 SQL 쿼리에 문제가 있습니다. 조건이 작동하지 않고이 쿼리를 실행할 때 ...하지만 조건을 사용할 때 작동하지 않을 때 다음과 같은 오류 메시지가 나타납니다 ..where 조건 SQL PIVOT

'수준 137, 수준 15, 상태 2, 줄 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) 

간부 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) 

이동 는 UR 메모리 공간을 차지합니다 .. 당신이 .. 불필요하게 더 많은 변수를 생성하지 않는 것이 좋습니다 ..

0

기존 쿼리의 문제는 변수입니다 @courseid1@subjid1은 동적 SQL 내에 정의되어 있지 않으므로 범위를 벗어납니다. 이 문제를 해결할 수

한 가지 방법은 SQL 문자열에 변수의 문자열 값을 연결하는 것입니다 : 위의 쿼리가 sp_executesql하는 것입니다 쓸

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) 

또 다른 방법은 당신이 전달됩니다 매개 변수 값 :

01 : 지금까지 WHERE 절에 두 번째 문제로

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; 

, 다음과 유사한 이름의 목록을 생성하는 쿼리를 작성해야