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