2017-11-23 21 views
0

아래의 where 문에서 동적 변수를 사용하는 뷰를 만들었습니다.뷰에서 SQL 선언 변수

DECLARE 
@wkFileYear SMALLINT = (select fs.FileYear from dbo.FileSemesters fs 
where fs.systemcurrentflag = 1), 
@wkFileSemester SMALLINT = (select fs.FileSemester from dbo.FileSemesters fs where fs.systemcurrentflag = 1) 

Select R.FileType, R.FileYear, R.FileSemester, R.ID, R.ClassCode, R1.Raw 
from 
(
SELECT SC.FileType, SC.FileYear, SC.FileSemester, SC.ID, SC.ClassCode 
FROM StudentClasses AS SC 
) as R 
LEFT JOIN 
(
SELECT SAR.Filetype,SAR.FileYear, SAR.FileSemester, SAR.ID, SAR.ClassCode, SAR.Result as Raw 
FROM  
StudentAssessmentResults AS SAR 
) as R1 

on r.FileYear = R1.Fileyear  
and R.FileSemester = R1.FileSemester 
and R.FileType = R1.FileType 
and R.ClassCode = R1. ClassCode 
and R.ID = R1.ID   

where 
R.FileType = 'A' 
AND (R.FileYear = @wkFileYear) 
AND (R.FileSemester = 
case 
when (left(R.classcode,2) = '12' or left(R.classcode,2) = '11') and @wkFileSemester = 4 
then 3 
else @wkFileSemester 
end 
) 

데이터베이스의보기로 저장하고 싶지만보기 내에서 변수를 선언 할 수 없습니다. CTE 또는 테이블 값 함수 사용에 대한 모든 정보를 살펴 보았지만 모든 구문에 대해서는 잘 모르겠습니다. 다양한 소스에서 예제를 사용하여 CTE 및 테이블 가치있는 함수를 만들려고 시도했지만 행운은 없습니다.

누군가가 내가 변수를 사용할 수있는 방법을 설명 할 수 있었지만 데이터베이스의보기로 저장할 수있게되기를 바랬습니다.

답변

2

뷰의 구조가 변수에 종속되지 않는 것은 당연합니다.

대신 @wkFileYear 및 @wkFileSemester 열을 쿼리에서 쿼리 할 수 ​​있도록 만들어야합니다.

또는 변수를 사용하려면 필요한 데이터를 반환하는 db 함수/저장 프로 시저를 만들 수 있습니다.

다음은 저장된 proc의 모습입니다.

 CREATE PROCEDURE [dbo].[sp_GetTestData] 
      --Param 
      @wkFileYear SMALLINT, 
      @wkFileSemester SMALLINT 
      AS 
     BEGIN 

     @wkFileYear = select fs.FileYear from dbo.FileSemesters fs where fs.systemcurrentflag = 1 
     @wkFileSemester = select fs.FileSemester from dbo.FileSemesters fs where fs.systemcurrentflag = 1 

     Select R.FileType, R.FileYear, R.FileSemester, R.ID, R.ClassCode, R1.Raw 
     from 
     (
     SELECT SC.FileType, SC.FileYear, SC.FileSemester, SC.ID, SC.ClassCode 
     FROM StudentClasses AS SC 
     ) as R 
     LEFT JOIN 
     (
     SELECT SAR.Filetype,SAR.FileYear, SAR.FileSemester, SAR.ID, SAR.ClassCode, SAR.Result as Raw 
     FROM  
     StudentAssessmentResults AS SAR 
     ) as R1 
     on r.FileYear = R1.Fileyear  
     and R.FileSemester = R1.FileSemester 
     and R.FileType = R1.FileType 
     and R.ClassCode = R1. ClassCode 
     and R.ID = R1.ID where 
     R.FileType = 'A' 
     AND (R.FileYear = @wkFileYear) 
     AND (R.FileSemester = 
     case 
     when (left(R.classcode,2) = '12' or left(R.classcode,2) = '11') and @wkFileSemester = 4 
     then 3 
     else @wkFileSemester 
     end 
     ) 
     end 
+0

뷰 내 FileSemesters 테이블에 조인을했는데 어떤 이유로이 속도가 훨씬 느린 것으로 나타났습니다. Year와 Semester를 where 문으로 하드 코딩 할 때 훨씬 빨랐습니다. 그래서 FileSemesters 테이블에 조인하지 않고 변수로 전달하려고했습니다. –

+0

저장 프로 시저 예제로 내 대답을 업데이트했습니다. – Chris