2017-12-24 10 views
2

誰でもこのコードの結果がエラーになる理由を説明できますか?SQL Server - TRYとCATCH内で "If ... Then"を使用してテンポラリテーブルを削除する

BEGIN TRY 
    IF OBJECT_ID ('TEMPDB..#ABC') IS NOT NULL 
    BEGIN 
     DROP TABLE #ABC 
    END; 

    SELECT 1 AS A, 2 AS B 
    INTO #ABC; 
END TRY 
BEGIN CATCH 
END CATCH; 

DROP TABLE #ABC; 

BEGIN TRY 
    IF OBJECT_ID ('TEMPDB..#ABC') IS NOT NULL 
    BEGIN 
     DROP TABLE #ABC 
    END; 

    SELECT 3 AS C, 4 AS D 
    INTO #ABC; 
END TRY 
BEGIN CATCH 
END CATCH; 

SELECT * FROM #ABC; 

エラーがドロップステートメントが第TRYブロックの前にあり、さらに第二TRY内部に、「IF OBJECT_IDがあっても#ABCテーブルが既に存在していることを示す第2のTRYとCATCHステートメントで起こります。 .. THEN DROP "ステートメント。

メッセージ2714、レベル16、状態1、行XX
次の2つのブロックの間に "GO"、またはSQL Serverを必要とするデータベース

+0

にテーブルの両方の結果を挿入した結果に4列をしたくない場合は - です使用される一意の名前ごとに追加のライセンス費用を支払わなければならないSQL Serverの奇妙なSKUを使用していますか?テンポラリテーブルの名前は最大116文字まで可能です - なぜ同じテンポラリテーブルの両方が*同じ*名前を使用することが重要ですか? –

答えて

1

で#ABCという名前のオブジェクトが既にあります単一のエンティティとして文全体を実行しようとします。

最初のセクションにDDLがあるため、2番目のステートメントが解析された時点でDDLは実行されません。最初のCATCHの終了後に "GO"を置くことによって、スクリプトは正常に実行されます。

1

INTO #ABCを1つのバッチに作成すると、SQL Serverのコンパイル時には、作成された条件を考慮しないため、同じテーブルを2回作成しようとしていると思うだけです。

BEGIN TRY 
    BEGIN 
    IF OBJECT_ID ('TEMPDB..#ABC') IS NOT NULL 
    DROP TABLE #ABC 
    create table #ABC(A tinyint, b tinyint, c tinyint, d tinyint) 
    END; 
    Insert into #ABC(A, B) 
    SELECT 1 AS A, 2 AS B 

END TRY 
BEGIN CATCH 
END CATCH; 

BEGIN TRY 
    Insert into #ABC(C, D) 
    SELECT 3 AS C, 4 AS D 

END TRY 
BEGIN CATCH 
END CATCH; 

SELECT * FROM #ABC; 

あなたは、2つの中間の一時テーブルを作成して、中間の一時テーブルに結果を挿入し、私は不思議を行う#ABC

関連する問題