我有一个带参数的SQL,评估参数的内容,并根据内容将不同的UDF应用于输入参数。
代码如下:
declare @order varchar(50) = 's12345..s12347'
if isnull( CHARINDEX('.',@order),0) >0
begin
select n as order_no into #temp
FROM F_GetAllNBetween(@order)
end
else if ( isnull( CHARINDEX(',',@order),0) >0 )
begin
select [value] as order_no into #temp2
FROM dbo.F_SplitList(@order,',')
end
if OBJECT_ID('tempdb..#temp') is not null
select * from #temp where order_no <>''
if OBJECT_ID('tempdb..#temp2') is not null
select * from #temp2 where order_no <>''
我想要做的是,将上述联合的输出转换为另一个临时表,并在其余代码的where子句中使用它。
我不能使用union,因为错误表示需要选择。
我无法使用cte,因为我无法使用检查来查看临时表是否为空
我不能忽略检查空的临时表,否则它会错误地说对象不存在(如果语句只创建了两个临时表中的一个)
我无法弄清楚如何将输出转换为不同的临时表。有任何想法建议或更好的方法吗?
答案 0 :(得分:3)
正如我的评论中所提到的,您可以使用UNION和WHERE子句来简化当前代码以实现所需的内容,以替换IF语句。 e.g。
SELECT order_no
--INTO #someTempTable -- if needed
FROM (
SELECT order_no = n
FROM dbo.F_GetAllNBetween(@order)
WHERE CHARINDEX('.', @order) > 0
UNION ALL
SELECT value
FROM dbo.F_SplitList(@order,',')
WHERE CHARINDEX(',', @order) > 0
) AS T
WHERE order_no <> '';