[英]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.