2013-10-29 5 views
6

私はテンポラリテーブル(#temp_table)を最初にチェックし、テンポラリテーブルがあればそれを削除し、テーブルを使用し、最後にテーブルを削除するストアドプロシージャを持っています。このSPは、ユーザが何かをトリガするときにランダムに呼び出され、時にはSPが同時に実行されるか、または重複して実行されることがあります。MS SQL Server 2005では、同じSPの異なる実行によって一時テーブルにアクセスするとどうなりますか?

私はExec1とExec2の両方が#tempテーブルを作成、変更、削除する同じSPの両方を持ち、互いに数ミリ秒以内に実行しているとします。

どうしますか? Exec1は#temp_tableをロックし、Exec1は終了しますがExec2は待機しますか?それは明らかに私の場合に望ましいでしょう。 Exec1 & 2がsametimeでテーブルを使用することは望ましくなく、Exec1が既にテーブルを使用しているため、Exec2が失敗することもありません。

[編集]私はちょうどテーブル変数に私の一時テーブルを変換する必要がありますか?

答えて

5

あなたはそれが一つの#記号のSQL Serverとローカルの一時テーブルを作成する場合は、アンダースコアとバックエンドでのいくつかのID数を使用しています。 #Tempという名前のTempテーブルを作成します。tempdbにSQL Serverを作成します。#Temp_______10912098という名前のテーブルを作成すると、別々の接続で作成されたすべてのTempテーブルは、名前の最後にon IDを持ちます。


TempTables

これらはすべて、名前#Tempを持っていますが、いくつかのアンダースコアが付加されており、unique id SQL Serverはそれらを区別するために使用する別の接続で作成されたすべての一時テーブルです。

+1

私のSPでは 'IF OBJECT_ID( 'tempdb ..#temp_table')がNULLではありません \t DROP TABLE#temp_tableこれは何もしませんか?あるいは、これは他の処刑に悪影響を及ぼす可能性がありますか? – jreed121

+2

一時テーブルの有効範囲がセッションに限定されているため、毎回新しいセッション(Webアプリなど)から呼び出す場合は、その必要はありません。詳細は私の答えを見てください。 –

+3

あなたはDommerのようにその必要はありませんが、それを作成しようとする前にOBJECTの存在をチェックするのは常に良い方法です。あなたのprocでそのビットのビットを保つ。 –

4

一時テーブル#tableの有効範囲はセッションに制限されているため、問題ではありません。

##tableを使用した場合は、グローバルで問題が発生します。

はこちらをご覧ください:MSDN SQL Tables

具体的に、このビット:データベースセッションは#employeesは、 セッションのみがテーブルで作業することができますローカルの一時テーブルを作成し、それが削除され

場合とき セッションの切断。グローバル一時テーブル ##employeesを作成すると、データベース内のどのユーザーもこのテーブルで作業できます。このテーブルを作成した後に他のユーザーがこのテーブルで作業していない場合は、切断するとテーブルが削除されて になります。別のユーザーがテーブル を作成した後で作業すると、SQL Serverは接続を切断した後に削除し、 は他のすべてのセッションがアクティブでなくなった後に削除します。 SQL Serverで

3

ハッシュ#という名前のテンポラリテーブルは、個々の接続に固有のものです。

2つの接続(「プロセス」または「SPID」とも呼ばれます)が両方とも同じテーブル#tablenameによって一時テーブルを参照する場合、実際には異なるテーブルを参照します。

tempdbを見ると分かります。 #748B826Cのような名前のテーブルが複数あります。これらは実際にはdeclare @t table (ix int identity primary key)のようなテンポラリテーブル変数と、ハッシュ付きのテンポラリテーブル名です。

これらは、再帰トリガーではなく異なる接続であるため、問題はありません。

ただし、再帰トリガの可能性が懸念される場合は、代わりにテーブル変数を使用する必要があります。これらは、バッチまたはストアドプロシージャの範囲に制限されています。

関連する問題