3

私はそれについて検索しましたが、何も見つかりませんでした(それを行うことは不可能だと思います)。私の問題は、一時テーブルが存在するかどうか、またその一時テーブルに特定のデータがあるかどうかを確認する必要があることです。

誰もこれに直面したことがありますか?どうやって解決できましたか?IF..ELSE何百万ものブロックを作成することは避けたいと思います。

編集:

IF (OBJECT_ID('tempdb..#tempTable') IS NOT NULL 
AND EXISTS (SELECT * FROM #tempTable WHERE THIS_COLUMN = 'value'))
BEGIN
   PRINT 'Temp table and data exists'
END
ELSE
BEGIN
   PRINT 'Temp table or data does not exist'
END

これが私がやりたいことです。問題は、tempTable が存在しない場合に発生します (発生する可能性があります)。最初のステートメントは false を返しますが、2 番目のステートメントを引き続き実行するため、エラーがスローされます。また、SELECTステートメントはテーブルを見つけることができないため、エラーがスローされます。私が見つけた解決策は、これを行うことでした:

IF OBJECT_ID('#tempTable') IS NOT NULL
BEGIN
    IF EXISTS (SELECT * FROM #tempTable WHERE THIS_COLUMN = 'value'
    BEGIN
        PRINT 'Temp table and data exists'
    END
    ELSE
    BEGIN
        PRINT 'Temp table exists but data does not exist'
    END
END
ELSE
BEGIN
    PRINT 'Temp table does not exist'
END

私の質問は、2 つの条件を持つ方法はありますか?最初の条件が false を返した場合、2 番目の条件をチェックしないでください。&&プログラミング言語での使用の種類。

4

5 に答える 5

3

これはコンパイル時の失敗であり、ステートメント全体を一緒にコンパイルする必要があるため、実行しようとしていることは不可能です。

ステートメントの最初の部分は評価されず、それが当てはまる場合にのみ2番目の部分がコンパイルされます。存在のテストとテーブルを参照するクエリを2つの別々のステートメントに分割して、別々にコンパイルする必要があります。

于 2012-09-20T11:47:20.407 に答える
2

私はこれを少し前に検索しましたが、正しく覚えていれば、SQL Serverは実際に論理条件を短絡しますが、if句に表示される順序に関係なく、最初にどちらをチェックするかを決定するのはSQLServerです。

于 2012-09-20T11:29:32.800 に答える
2

こちらをご覧ください

XAND 論理ゲート (排他的 AND) のようなものはありません。理論的には、XAND は、両方のオペランドが true または両方が false であることを意味します。したがって、これは、少なくともビットごとの論理演算では、XAND が Equals (=) と同じであることを意味します。

あなたがやろうとしていることを説明するために、いくつかのサンプルコードを示してください。

よろしく

于 2012-09-20T09:25:02.790 に答える
1

これはおそらく大ざっぱな解決策ですが、取得しようとしている if、else、then 構造の種類を制御するために COALESCE ステートメントを使用することがあります。この場合、coalesce ステートメントの逆を探しているため、見た目が少し汚いです。

DECLARE @temp_message AS varchar(100)
SELECT @temp_message = COALESCE(CASE
                                 WHEN OBJECT_ID('tempdb..#tempTable') IS NOT NULL THEN NULL
                                 ELSE 'Temp table does not exist'
                                END,
                                CASE
                                 WHEN EXISTS (SELECT * FROM #tempTable WHERE THIS_COLUMN = 'value') THEN NULL
                                 ELSE 'Specified value does not exist in temp table'
                                END,
                                'Temp table and data exists')

PRINT @temp_message

COALESCE は、NULL 値が生成されなくなるまで、ステートメントを次々と実行します。つまり、コストのかかる大規模なクエリを実行する前に、一連の小さなクエリを実行していくつかの値をチェックするなど、クールなことを実行できるということです。それが本当に違法かどうか教えてください!それは私のマシンで動作しました:)

于 2014-07-10T23:42:44.533 に答える
0

MSSQL でこれに近づく方法は 2 つあります。

初め。(動的 sql)を使用するsp_executesqlと、ストアド プロシージャはエラーなしでコンパイルされます。また、#tempTable が存在しない場合、サーバーはエラーを出力しますが、バッチ実行を続行します。

exec sp_executesql N'SELECT count(*) FROM #tempTable WHERE THIS_COLUMN = ''value'''
if @@rowcount > 0 
     print 'ok'
else 
     print 'error'
end;

2番。0 と 1 を出力するネストされた IF と EXISTS を使用してユーザー定義関数を作成するだけです (現在行っているように)。動的 SQL を使用して、テーブル名と可能なフィルター値をこの UDF に入力します。この場合、この UDF を IF で使用できます。

于 2012-09-20T12:34:56.960 に答える