0

我有一块SQL接受参数,评估参数的内容并根据内容对输入参数应用不同的UDF。SQL Server联合临时表

的代码是这样的:

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子句中使用它。

我不能使用联合,因为它错误说预计选择。

,因为我无法使用检查,看是否临时表是空的,我不能使用CTE

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

我无法弄清楚如何获得输出到不同的临时表。任何想法建议或更好的方式做同样的请吗?

+0

输入参数将只有一个“。”。 (句号)或者一个“,”(逗号) – Harry

+0

我想你可以通过删除临时表来简化整个事情,如果我正确理解它的话。例如,'select order_no from(from order_no from 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 <>'';' – ZLK

+0

@ZLK Doh!为什么我没有想到这一点!只是要说明让代码工作是多么容易。写这个答案,我可以接受它。谢谢! – Harry

回答

1

正如我的评论中所提到的,您可以简化当前的代码,以便用UNION和WHERE子句来取代IF语句。例如

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 <> ''; 
+0

谢谢你的答案..但出于好奇..如果你想做我原本想做的事情,我该怎么做? – Harry

+1

@Harry,我会创建一个临时表(或使用一个表变量),并将其插入#temp1(如果存在)和#temp2(如果存在)中。例如'DECLARE @T TABLE(order_no varchar(255)); IF OBJECT_ID(...)不是NULL INSERT @T SELECT order_no'等 – ZLK