Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 在视图中声明变量的SQL_Tsql_Variables_View_Declare - Fatal编程技术网

Tsql 在视图中声明变量的SQL

Tsql 在视图中声明变量的SQL,tsql,variables,view,declare,Tsql,Variables,View,Declare,我创建了一个视图,它在下面的where语句中使用动态变量 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)

我创建了一个视图,它在下面的where语句中使用动态变量

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和表值函数,但没有成功


希望有人能解释我如何仍然可以使用变量,但允许我将其保存为数据库中的视图。

视图的结构依赖于变量是没有意义的

相反,您需要在视图中创建@wkFileYear和@wkFileSemester列,以便查询

或者,如果希望使用变量,可以创建一个返回所需数据的db函数/存储过程

下面是一个存储过程的示例

        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

视图的结构依赖于变量是没有意义的

相反,您需要在视图中创建@wkFileYear和@wkFileSemester列,以便查询

或者,如果希望使用变量,可以创建一个返回所需数据的db函数/存储过程

下面是一个存储过程的示例

        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

我在视图中加入了filesemests表,但由于某些原因,这要慢得多。当我把一年和一学期硬编码到where语句中时,速度要快得多,这就是为什么我想尝试将它们作为变量而不是联接到FileeMests表中的原因。我已经用存储过程示例更新了我的答案。我在视图中联接了FileeMests表,但由于某些原因,这要慢得多。当我将一年和一学期硬编码到where语句中时,速度要快得多,所以这就是为什么我想尝试将它们作为变量带入,而不是加入到FILESEMests表中。