SQL Server联合临时表

时间:2017-08-14 01:37:54

标签: sql-server user-defined-functions sql-server-2016 temp-tables union-all

我有一个带参数的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,因为我无法使用检查来查看临时表是否为空

我不能忽略检查空的临时表,否则它会错误地说对象不存在(如果语句只创建了两个临时表中的一个)

我无法弄清楚如何将输出转换为不同的临时表。有任何想法建议或更好的方法吗?

1 个答案:

答案 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 <> '';