【发布时间】:2019-07-08 14:23:17
【问题描述】:
今天我遇到了一个与 IF 语句有关的奇怪问题。在我完成替换/创建 CTE 之后,我的 CTE 之后有 IF 语句,并且不断收到以下错误:
'if' 附近的语法不正确
查询:
-- Other CTE's above.
CTE6 AS
(
SELECT
-- Multiple Columns
FROM
table1
)
-- When the Query runs, I'd like it to use the correct IF BLOCK.
-- Error starts here.
if @param_policy = '1'
select * from CTE4
where mid not in (select distinct mid from CTE6)
and [CN] = @param_policy
if @param_policy = '2'
select * from CTE4
where mid not in (select distinct mid from CTE6)
and [CN] = @param_policy
if @param_policy = '3'
select * from CTE4
where mid not in (select distinct mid from CTE6)
and [CN] = @param_policy
if @param_policy = '4'
select * from CTE4
where mid not in (select distinct mid from CTE6)
and [CN] = @param_policy
-- UPDATED
select * from CTE4 WHERE @param_policy = 'batch' and mid not in (select distinct mid from CTE6)
and not
(([Client Number] ='5' and Pnum = 'IN' )
or ([Client Number] ='6' and Pnum = 'G')
or [Client Number] in ('7' , '8', '9')
)
还包括,当它执行select * from CTE4 时,它认为 CTE4 无效,并且它没有将“mid”识别为有效列。
我的 CTE 以前是临时表。
有人知道如何解决这个问题吗?
谢谢。
【问题讨论】:
-
你的 4 个 SQL 看起来完全一样。如果是这样,你为什么需要
if?如果不是这样,如果您向我们展示这些案例的实际差异,您可能会得到更好的答案。 -
不幸的是,您用 CTE 替换临时表的想法需要您重新设计代码。简而言之,CTE 只能由单个语句引用。也许您应该重新使用临时表 - 根据不完整的代码和未知目标提出建议可能会产生误导。
-
@SMor OPENQUERY 不允许使用临时表,因此必须切换到 CTE。这是“重新设计”我的查询的唯一建议方法。
-
OPENQUERY在FROM子句中使用,因此不适用于IF语句。更好的方法是从OPENQUERY获取所有数据,然后在本地过滤。如果您确实需要在远程服务器上执行条件语句,请考虑使用EXEC AT。 -
这是 XY 问题的一个例子。 xyproblem.info
标签: sql-server tsql common-table-expression