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