繁体   English   中英

存储过程中的SQL with子句

[英]SQL with clause in stored procedure

是否可以在存储过程中定义with子句并在if else语句中使用它,因为我总是会收到错误?

BEGIN
    WITH Test (F, A) AS
    (
        SELECT FM.ID, FM.Name 
        FROM [Test.Abc] FM
        INNER JOIN [Organization] O on O.ABCID = FM.ID
    )

    IF(@var = 'case1')
    BEGIN
        SELECT * 
        FROM Test F
        WHERE NOT F.ID = 'someID'
    END

我总是在if语句前收到“语法错误”错误

如果我将with子句移到if语句中,则可以正常工作。 但是我需要外部的with语句在其他if语句中重用它。

只需使用临时表或表变量即可。 SQL Server的范围规则确保在过程结束时删除此类表:

BEGIN
    select FM.ID, FM.Name
    into #test
    from [Test.Abc] FM inner join
         [Organization] O
         on O.ABCID = FM.ID;

    IF(@var = 'case1')
        BEGIN
            select *
            from #Test F
            where not F.ID = 'someID'
        END;

这样的好处是可以将索引添加到表中,这些索引可以提高性能。

这是您得到的相同答案的另一个版本:

with common table expresson的语句必须与调用它的查询在同一语句中,并且必须由查询(或其他cte )引用,否则它是语法错误。

请参考文档准则“ 创建和使用公用表表达式”

BEGIN -- doing stuff
-- .... doing stuff over here
IF(@var = 'case1')
    BEGIN
        with Test (F, A) as (
        select FM.ID, FM.Name from [Test.Abc] FM
        inner join [Organization] O on O.ABCID = FM.ID
          )     
        select * from Test F
        where not F.ID = 'someID'
    END
-- .... and doing some other stuff over here too
END -- done with this stuff

WITH不是独立的,它始终是整个语句的一部分,并且仅是一个语句。
在其声明范围之外无法识别。

BEGIN

    with my_cte (n) as (select 1+1)
    select * from my_cte

    -- The following statement yields the error "Invalid object name 'my_cte'."    
    -- select * from my_cte

END

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM