2008-09-05 23 views
0

これを行うことはできませんし、回避策はありますか?SQL Server 2005エラー

このエラーが発生します。

メッセージ2714、レベル16、状態1、行13 データベースには、すでに '#temptable'という名前のオブジェクトがあります。

declare @x int 

set @x = 1 

if (@x = 0) 
begin 
    select 1 as Value into #temptable 
end 
else 
begin 
    select 2 as Value into #temptable 
end 

select * from #temptable 

drop table #temptable 

答えて

1

これは2つの質問とKev Fairchil dは最初の質問を完全に無視した2番目の質問に良い答えを与えます - なぜエラーが生成されますか?

答えは、プリプロセッサの仕組みにあります。この

SELECT field-list INTO #symbol ... 

DECLARE #symbol_sessionid TABLE(field-list) 
INSERT INTO #symbol_sessionid SELECT field-list ... 

に直接同等である構文解析木に分解され、これはローカルスコープの名前テーブルに#symbolを置きます。 _sessionidを使用するビジネスは、各ユーザーセッションにプライベート名前空間を提供することです。 2つのハッシュ(##記号)を指定すると、この動作は抑制されます。 sessionid拡張の混乱と解消は、(やわらかく)透明です。

これは、複数のINTO #symbol句が同じスコープ内で複数の宣言を生成し、メッセージ2714に至ることを示しています。

0

私は、#temptableを作成していないということを推測します。

申し訳ありません申し訳ありませんが詳細を説明することはできませんが、あなたが何を見ているのか説明しようとしていないので、あまり魅力的な答えは得られません。

1
あなたは遅延名前解決のため、あなたは本当のテーブルでそれを行うことができますので、ちょうどあなたがまた、上に最初の一時テーブルを作成することができ

シャープ記号を取り出し、その後、定期的に行うことはできません

テーブルに挿入

0

コードの外観から、SQL Studioやこれと同様のプロトタイプを作成していたようですね。私はあなたがこれを数回実行して、それが#temptableで作成されたポイントまで到達したが、それが終わりに達する前に失敗してテーブルを再び落としたと思いますか?使用しているSQL編集ツールを再起動して、もう一度やり直してください。

1

最初のステップ...テーブルがすでに存在するかどうかをチェックします。存在する場合は削除します。次に、SELECT INTO ...を使用するのではなく、明示的にテーブルを作成します。

このように信頼性が高いことがわかります。

IF OBJECT_ID('tempdb..#temptable', 'U') IS NOT NULL 
BEGIN 
DROP TABLE #temptable 
END 

CREATE TABLE #temptable (Value INT) 

declare @x int 

set @x = 1 

if (@x = 0) 
begin 
    INSERT INTO #temptable (Value) select 1 
end 
else 
begin 
    INSERT INTO #temptable (Value) select 2 
end 

select * from #temptable 

drop table #temptable 

また、うまくいけば、テーブル名とフィールド名はあなたの例のために簡素化され、あなた本当にがそれらを呼んではありませんされている。

) - ケビン・フェアチャイルド

1

遅延名前解決もありますあなたがsp_dependsが正しい結果を返すことを確かめることができない理由は、この記事をチェックしてください。私はしばらく前に書きましたDo you depend on sp_depends (no pun intended)