質問
なぜこれができないのか、また回避策はあるのでしょうか?
このエラーが発生します。
MSG 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
解決
これは 2 つの部分からなる質問で、Kev Fairchild は 2 番目の質問には適切な回答をしていますが、最初の質問は完全に無視しています。 なぜエラーが発生するのでしょうか?
答えはプリプロセッサの動作方法にあります。これ
SELECT field-list INTO #symbol ...
は、次と直接同等の解析木に解決されます。
DECLARE #symbol_sessionid TABLE(field-list)
INSERT INTO #symbol_sessionid SELECT field-list ...
これにより、 #symbol がローカル スコープの名前テーブルに追加されます。_sessionid の役割は、各ユーザー セッションにプライベート ネームスペースを提供することです。2 つのハッシュ (##symbol) を指定すると、この動作は抑制されます。sessionid 拡張子の変更と変更解除は (明らかに) 透過的です。
これらすべての結果として、複数の INTO #symbol 句により同じスコープ内で複数の宣言が生成され、メッセージ 2714 が発生します。
他のヒント
名前解決が遅延しているため、それはできません。シャープ記号を削除するだけで、実際のテーブルを使用して実行できます。
最初に一時テーブルを作成してから、テーブルに通常の挿入を行うこともできます。
最初の一歩...テーブルがすでに存在するかどうかを確認してください...存在する場合は削除してください。次に、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
また、テーブル名とフィールド名は例のために単純化されており、実際のものではないことを願っています。 本当に 彼らへ電話します ;)
-- ケビン・フェアチャイルド
名前解決の遅延は、sp_depends が正しい結果を返すかどうかを確認できない理由でもあります。私が少し前に書いたこの投稿を確認してください。 sp_depends に依存していますか (冗談ではありません)
#temptable を作成していないことが問題だと推測します。
申し訳ありませんが、これ以上詳しくはできませんが、表示されている内容を説明しようともしていないため、あまり優れた答えが得られません。
コードを見ると、これを SQL Studio またはそれに類似したものでプロトタイピングしているように見えますよね?これを数回実行して、 #temptable が作成されるところまでは到達しましたが、最後に到達する前に失敗し、テーブルを再び削除したと推測できますか?使用している SQL 編集ツールを再起動し、再試行してください。