web-dev-qa-db-ja.com

SQL Serverのローカルおよびグローバル一時テーブル

SQL Serverのローカル一時テーブルとグローバル一時テーブルの違いは何ですか?

135
andrew Sullivan

私はこの説明が非常に明確だと思います(それは Technet からの純粋なコピーです):

一時テーブルには、ローカルとグローバルの2つのタイプがあります。ローカル一時テーブルは、テーブルが最初に作成または参照されたときと同じSQL Serverのインスタンスへの接続中に、作成者にのみ表示されます。ユーザーがSQL Serverのインスタンスから切断すると、ローカル一時テーブルが削除されます。グローバル一時テーブルは、作成後にすべてのユーザーとすべての接続に表示され、テーブルを参照しているすべてのユーザーがSQL Serverのインスタンスから切断されると削除されます。

104
Don
  • テーブル変数DECLARE @t TABLE)は、それを作成した接続にのみ表示され、バッチまたはストアドプロシージャが終了すると削除されます。

  • ローカル一時テーブルCREATE TABLE #t)は、それを作成した接続にのみ表示され、接続が閉じられると削除されます。

  • グローバル一時テーブルCREATE TABLE ##t)はすべてのユーザーに表示され、それらを参照しているすべての接続が閉じられると削除されます。

  • Tempdb永続テーブルUSE tempdb CREATE TABLE t)はすべてのユーザーに表示され、サーバーの再起動時に削除されます。

300
Anthony Faull

1。)ローカルテンポラリテーブルは、接続の期間のみ、または複合ステートメント内で定義されている場合、複合ステートメントの期間。

ローカル一時テーブルは、テーブルを作成したSQL Serverセッションまたは接続(シングルユーザーを意味する)でのみ使用できます。これらは、テーブルを作成したセッションが閉じられると自動的に削除されます。ローカルの一時テーブル名は、シングルハッシュ( "#")記号で始まります。

CREATE TABLE #LocalTemp
(
 UserID int,
 Name varchar(50), 
 Address varchar(150)
)
GO
insert into #LocalTemp values ( 1, 'Name','Address');
GO
Select * from #LocalTemp

ローカル一時テーブルのスコープは、現在のユーザーの現在のセッション、つまり現在のクエリウィンドウに存在します。現在のクエリウィンドウを閉じるか、新しいクエリウィンドウを開いて、上記で作成した一時テーブルを見つけようとすると、エラーが発生します。


2。)グローバル一時テーブルは永続的にデータベースに残りますが、行は特定の接続内にのみ存在します。接続が閉じられると、グローバル一時テーブルのデータは消えます。ただし、次回データベースを開いたときに、テーブル定義はアクセスのためにデータベースに残ります。

グローバル一時テーブルは、すべてのSQL Serverセッションまたは接続(すべてのユーザーを意味します)で使用できます。これらは任意のSQL Server接続ユーザーが作成でき、すべてのSQL Server接続が閉じられると自動的に削除されます。グローバル一時テーブル名は二重ハッシュ( "##")記号で始まります。

CREATE TABLE ##GlobalTemp
(
 UserID int,
 Name varchar(50), 
 Address varchar(150)
)
GO
insert into ##GlobalTemp values ( 1, 'Name','Address');
GO
Select * from ##GlobalTemp

グローバル一時テーブルはすべてのSQL Server接続に表示されますが、ローカル一時テーブルは現在のSQL Server接続にのみ表示されます。

11
Vivek S.

Books Onlineからの引用:

ローカル一時テーブルは、現在のセッションでのみ表示されます。グローバル一時テーブルはすべてのセッションに表示されます。

一時テーブルは、DROP TABLEを使用して明示的に削除しない限り、スコープから外れると自動的に削除されます。

  • ストアドプロシージャで作成されたローカル一時テーブルは、ストアドプロシージャが完了すると自動的に削除されます。テーブルは、テーブルを作成したストアドプロシージャによって実行されるネストされたストアドプロシージャによって参照できます。テーブルを作成したストアドプロシージャを呼び出したプロセスは、テーブルを参照できません。
  • 他のすべてのローカル一時テーブルは、現在のセッションの終了時に自動的に削除されます。
  • グローバル一時テーブルは、テーブルを作成したセッションが終了し、他のすべてのタスクがそれらの参照を停止すると自動的に削除されます。タスクとテーブルの間の関連付けは、単一のTransact-SQLステートメントが存在する間のみ維持されます。つまり、セッションの作成が終了したときにテーブルをアクティブに参照していた最後のTransact-SQLステートメントの完了時に、グローバル一時テーブルが削除されます。
11

データベーススコープのグローバル一時テーブル (現在、Azure SQL Databaseでのみサポートされています)もあることに言及する価値があります。

SQL Serverのグローバル一時テーブル(##テーブル名で開始)はtempdbに格納され、SQL Serverインスタンス全体のすべてのユーザーのセッション間で共有されます。

Azure SQL Databaseは、tempdbにも格納され、データベースレベルにスコープされるグローバル一時テーブルをサポートします。つまり、同じ一時SQLテーブル内のすべてのユーザーのセッションでグローバル一時テーブルが共有されます。 他のデータベースからのユーザーセッションはグローバル一時テーブルにアクセスできません。

-- Session A creates a global temp table ##test in Azure SQL Database testdb1
-- and adds 1 row
CREATE TABLE ##test ( a int, b int);
INSERT INTO ##test values (1,1);

-- Session B connects to Azure SQL Database testdb1 
-- and can access table ##test created by session A
SELECT * FROM ##test
---Results
1,1

-- Session C connects to another database in Azure SQL Database testdb2 
-- and wants to access ##test created in testdb1.
-- This select fails due to the database scope for the global temp tables 
SELECT * FROM ##test
---Results
Msg 208, Level 16, State 0, Line 1
Invalid object name '##test'
0
Lukasz Szozda