1

私はこの SQL コードに正気を失いつつあります。以下の IF ELSE ステートメントは、単純な PRINT ステートメントでテストすると正しく機能します。つまり、テーブルが存在しないため、「FALSE」が出力されます。しかし、SETステートメントのコメントを外して実行すると、SETステートメントを実行しようとし、テーブルが存在しないため、当然エラーになります。

DECLARE @zeus_calls310_counter int;

IF EXISTS (SELECT * FROM [zeus].tpza.INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'calls_310')
BEGIN
    --SET @zeus_calls310_counter = (SELECT COUNT(*) FROM [zeus].[tpza].[dbo].[calls_310]);
    PRINT 'TRUE'
END
ELSE 
BEGIN
    PRINT 'FALSE';
END
4

4 に答える 4

5

あなたのタイトルは、あなたの理解がどこで間違っているかを示しています。テーブルが存在しない場合でも、SETステートメントが実行されてエラーが発生するわけではありません。ステートメントが解析されると、エラーが発生します。

SQL を実行するときはいつでも、サーバーは最初にステートメントを解析し、解析が成功した場合はそれを実行します。したがって、テーブルの存在に依存する生の SQL を持つことはできません! テーブルが存在するかどうかにかかわらず、SETステートメントは解析されます。したがって、存在しない場合、解析は失敗します。

これに対する 1 つの解決策は、 内に存在する場合と存在しない場合があるオブジェクトに依存するステートメントをラップすることですEXEC。ただし、この場合、そのテーブルに対するクエリの結果を変数に入力する必要があり、EXECその変数内はスコープ外になります。そのため、何をしようとしている@zeus_calls310_counterのかについて、より詳細な情報が必要になります。すぐに使用する場合は、宣言を含む全体をEXEC.

于 2013-02-12T09:33:41.563 に答える
2

@AAkashM は正しい軌道に乗っています。

EXEC sp_executesqlを使用する場合は、ステートメントの結果が含まれる OUTPUT パラメータも指定できますSELECT COUNT

于 2013-02-12T12:20:10.210 に答える
-1

テーブルが存在するかどうかを確認するためにこれを使用します

IF OBJECT_ID(N'[zeus].[table_name]', N'U') IS NULL
BEGIN
    --
END
ELSE
BEGIN
    --
END
于 2013-02-12T09:22:05.753 に答える