質問

なぜこれができないのか、また回避策はあるのでしょうか?

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

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 編集ツールを再起動し、再試行してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top