0

なぜこれができないのですか、回避策はありますか?

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

メッセージ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
4

6 に答える 6

1

延期された名前解決のためにそれを行うことはできません。実際のテーブルで行うことができます。ポンド記号を取り除くだけです

最初に一時テーブルを作成してから、テーブルに通常の挿入を行うこともできます

于 2008-09-05T18:42:33.613 に答える
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

また、うまくいけば、テーブルとフィールドの名前はあなたの例のために単純化されており、あなたが実際に呼んでいるものではありません;)

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

于 2008-09-05T18:57:40.253 に答える
1

延期された名前解決は、sp_depends が正しい結果を返すことを確認できない理由でもあります。私がしばらく前に書いたこの投稿を確認してください。

于 2008-09-05T19:02:18.167 に答える
1

これは 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 につながることです。

于 2008-09-29T04:58:08.787 に答える
0

問題は、#temptable を作成していないことだと思います。

申し訳ありませんが、これ以上詳しく説明することはできませんが、あなたが見ているものを説明しようとさえしていないので、あなたは恒星とは言えない答えを得る.

于 2008-09-05T18:41:06.127 に答える
0

コードを見ると、SQL Studio などでこれをプロトタイピングしているように見えますよね? これを数回実行して、#temptable が作成されるところまで到達したが、最後に到達してテーブルを再び削除する前に失敗したと推測できますか? 使用している SQL 編集ツールを再起動して、もう一度やり直してください。

于 2008-09-05T18:47:13.117 に答える