2012-03-21 3 views
3

を考える:ストアドプロシージャの内部一時テーブルを削除した後に再作成することはできますか?

コード:

select bleh 
    into #tblTemp 
    from FunctionThatReturnsTable('some','params') 

-- do some stuff 

drop table #tblTemp 

-- Error on this command: 
-- 'There is already an object named '#tblTemp' in the database.' 
select bleh 
    into #tblTemp 
    from FunctionThatReturnsTable('some','other params') 

問題:

私は、この一時テーブルを再作成することはできません。私の回避策は、#tmpTable1、#tmpTable2、#tempTable3などを使用することです。これを回避する方法はありますか?毎回1つのテンポラリテーブルを使用するだけでいいです。

そうでない場合、これはなぜですか?

+3

で同じのケーススタディをご覧ください。 #tempテーブル名? #tempテーブルを削除せずに、特定の目的ごとに別の名前を使用すると、tempdbでスキーマの動作が改善されることをお勧めします。あなたのケースでこれは当てはまるかもしれないし、そうでないかもしれないが、同じ名前を何度も何度も何度も繰り返し使用することのメリットはない。 –

+0

@AaronBertrand私は、変数を再利用するのが最良ではないことに同意しますが、毎回同じ関数から同じ列を引き出しています。あまりにも細かいところまで行くと、同じ変数名を保つだけで意味がありました。 答えでこれができない理由を教えてください。もしそうなら、私はupvoteと答えとしてマークします。 – DJTripleThreat

+0

毎回同じカラムを持つ同じ一時テーブルを使用している場合は、 'delete'または' truncate'を使ってテーブルをクリアし、その後の 'select into'ステートメントを既存のテーブルに' insert'するように変更してください。 – HABO

答えて

10

を使用してお勧めしたい

は、私の答えは、あなたが作成する各オブジェクトごとに異なる#TEMPテーブル名を使用することであることを示唆しているつもりです。それは医者に「私がこれをすると痛い」と言うようなものです。彼の有望な反応は、「それをやめろ!」となるだろう。

これが問題である理由は、SQL Serverのパーサーがバッチ全体を1回の解析で解析しようとするためです。同じ#tempテーブルを複数回作成しようとしていることが明確に分かりますが、その間にDROPコマンドは無視されます(ソースコードにアクセスできないので、その理由を正確に伝えることはできません)。これは、あなたがこれを行うことはできません同じ理由です:

IF (1=1) 
    CREATE TABLE #foo(i INT); 
ELSE 
    CREATE TABLE #foo(i VARCHAR(32)); 

パーサは、2人の同一の名前を見て、本当にIF/ELSEロジックに従うことができません。 #TEMPテーブルを同じ名前の問題の複数のを回避することに加え

はパーサの原因となる、ユニークな名前を使用する別の利点は、あなたが明示的にそれらをドロップしない場合、彼らは再利用することができるということです。これにより、メタデータ/ロックの観点からtempdbの負荷が軽減されます。

+0

Aaronありがとう、私はこれに対する答えを感謝します。 – DJTripleThreat

0

この問題は、+挿入列を削除すると発生しました。この問題はパーサーが最初に作成したテーブルを「認識」していて、削除されていないことがわかります。私は私のコメントが反映されているようにexec sp_executesql 'create table'

+1

これは、実際には、動的SQLで作成したexecテーブル以外は存在しないため、OPが動的SQL内の#tempテーブルを使用してすべての作業を行う必要があることを意味します。私はこれがまったく優雅な解決策ではないと思います。 –

0

これは、マイクロソフト接続バグID 666430

に対して設計することにより機能であり、Microsoftが明らかになったあなたが同じを再使用して維持する必要があるのはなぜ temporary-table-could-not-be-re-created

+0

"一時テーブルを再作成できませんでした"というリンクが壊れています。その情報がまだどこかで利用可能かどうか知っていますか? –

関連する問題