0

私は、パラメータを受け取り、パラメータの内容を評価し、内容によっては入力パラメータに異なるUDFを適用するSQLの一部を持っています。私が何をしたいか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を使用することはできません

私は他の空の一時テーブルステートメントは唯一の1を作成した場合、オブジェクトが(存在しないと言ってもエラーチェックを無視することはできません2つの一時テーブル)

出力を別の一時テーブルに取得する方法がわかりません。任意のアイデアの提案や同じように行うより良い方法はどうですか?

+0

入力パラメータの "。" – Harry

+0

私はそれを正しく理解していれば、一時テーブルを削除することで全体を単純化できると思います。例えば、 '(ORDER_NOとしてNを選択f_getallnbetweenから(@order)CHARINDEX( ' ' @order)> 0組合から全てdbo.f_splitlist(@order、'、')CHARINDEXから[値]を選択しORDER_NO選択( '、' @order)> 0)を指定します。ここで、order_no <> ''; ' – ZLK

+0

@ZLK Doh!なぜ私はそれを考えなかったのですか?ちょっとしたコードを作っていくのがいかに簡単かを示しています。これを答えとして書くと、私はそれを受け入れることができます。ありがとうございました! – Harry

答えて

1

私のコメントで述べたように、IF文を置き換えるのにUNIONとWHERE句で必要なものを達成するために、現在のコードを単純化することができます。例えば

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へと挿入(存在する場合)と#1 TEMP2。例えば'DECLARE @T TABLE(order_no varchar(255)); IF OBJECT_ID(...)がNULLでない場合はINSERT @T SELECT order_no'など – ZLK

関連する問題