【问题标题】:SQL Declaring Variables in a ViewSQL 在视图中声明变量
【发布时间】:2017-11-23 06:52:59
【问题描述】:

我在下面的 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 和表值函数,但没有成功。

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

【问题讨论】:

    标签: tsql variables view declare


    【解决方案1】:

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

    相反,您需要在视图中创建可以查询的@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
    

    【讨论】:

    • 我在视图中加入了 FileSemesters 表,但发现由于某种原因这要慢得多。当我将 Year 和 Semester 硬编码到 where 语句中时,速度要快得多,所以这就是为什么我想尝试将它们作为变量而不是加入 FileSemesters 表的原因。
    • 我已经用存储过程示例更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 2012-03-13
    • 2015-05-04
    • 2011-05-12
    相关资源
    最近更新 更多