2つのセッションで同じ名前の#tempテーブルを作成できますか?


16

一時テーブル(#myTable)を作成し、カーソルを使用しています。これは、同時ユーザーがアプリケーションを介してカーソルにアクセスしているときに問題を引き起こしますか?同じ名前の個別の一時テーブルを作成できますか?

サンプルコードは次のとおりです。

Open cursor;
Fetch Next from cursor into @Variable_Temp_Table_Name;
Create table #myTable(pk int)
While @@Fetch_Status = 0
Begin    
Fetch Next from cursor into @Variable_Temp_Table_Name;
End 

回答:


20

SQLサーバーは、一時テーブル名の最後に(舞台裏で)常に乱数を追加します。同時ユーザーがセッションで同じ名前の一時テーブルを作成すると、SQLサーバーはtempdbに複数の一時テーブルを作成します。

#TempTableSSMSで3つの異なるセッションで呼び出される3つの一時テーブルを作成しましたが、tempdbにアクセスすると、各一時テーブルの名前にランダムな(一意の)文字列が追加された一時テーブルが表示されます。

ここに画像の説明を入力してください


11

はい、複数のアプリケーションが#tempテーブルの独自のコピーを取得します。各同時セッションには独自の独立したオブジェクトがあるため、これが#tempテーブルを使用するポイントです。これは、カーソルを#tempテーブルと組み合わせて使用​​しているかどうかとは関係ありません(カーソルはとにかく必要ではないと思いますが、具体的にコメントするのに十分なコードを含めていませんでした)。

編集してコメントを含める:

#tempテーブルの使用に関するもう1つのことは、制約を追加する必要がある場合、テーブルがセッションに一意であっても、SQLサーバーが名前を生成できるようにすることです。テーブル。


7
#tempテーブルの使用に関するもう1つのことは、制約を追加する必要がある場合、テーブルがセッションに対して一意であるにもかかわらずSQLサーバーが名前を生成できるようにすることです。テーブル。
アーロン

1
@Aaron-名前のない制約に関するコメントを回答に移動することを提案します。多くの人がその詳細を台無しにしています。
RLF

また、誰かグローバル一時テーブル必要な場合、それを宣言できることに注意してください##likeThis
underscore_d

@RLFとAaron:常にNEWID()を使用してGUIDを生成し、ダイナミックSQLを介して制約を作成できます。これはCREATE TABLEステートメントに含めるほどきれいではありませんが、少なくともオプションです。また、一時テーブルではFK制約は許可されていないと考えています(一般的に制約について話している場合)。
ソロモンラッツキー

@srutzky-True。ただし、名前付き制約は通常、コードから簡単に参照できるように名前が付けられます。NEWID()を使用しても単純化されませんが、必要に応じてクエリを実行してNEWIDを見つけることができます。
RLF
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.