2017-03-11 6 views
2
IF OBJECT_ID('tempdb..#tempTable2') IS NOT NULL 
DROP TABLE #tempTable2; 

IF @someCondition is not null 
BEGIN 
    SELECT * INTO #tempTable2 FROM Table; --No problem, no error 
END 
ELSE 
BEGIN 
    SELECT * INTO #tempTable2 FROM Table; --Execution failed 
END 

メッセージ2714、レベル16、状態1、行197データベースに '#tempTable2' という名前のオブジェクトがすでに存在しています。Tempテーブルに選択すると、個別のIF条件に存在できませんか?

私は上記の理由を知ることができますか?手順1.最初のIFセクションのクエリが実行されていないので、#tempTable2を作成しないでください。

+0

あなたは他の部分に 'ドロップtable'を追加することができます。なぜこのようなことが起きるのか分かりません。おそらく、テーブルの作成は、SQL Serverが文を解析するときに実行されます。** Before **は実行されているため、事前に条件の結果を認識しません。 –

+0

'IF'セクションに' drop table'コマンドを入れてテストしましたが、うまくいきません。 –

答えて

1

同じ手順で同じ名前のテンポラリテーブルを作成するステートメントを2つ使用することはできません。 これは、遅延された名前解決を持たないSQL 6.5からの残されたものです。

select intoを使用する代わりに、create table + insertを使用してください。

Answer by Erland Sommarskog on MSDN Social

if object_id('tempdb..#tempTable2') is not null 
    drop table #tempTable2; 

create table #tempTable2 (...); 

if @someCondition is not null 
begin 
    insert into #tempTable2 
    select * from Table; 
end 
else 
begin 
    insert into #tempTable2 
    select * from Table; 
end 
0

私はあなたの英語を理解することを願っています。 問題は "if"ではなく、 "select * into table2 into table1"という構造を持つ の "select"ステートメントは、ssmsに新しいテーブルを自動的に作成します。 つまり、別の時間に同じステートメントを使用すると、table2はすでにデータベースに作成されています。 もう一度作成する必要はなく、別の名前で作成することもできます。

関連する問題