SQL Serverのローカル一時テーブルとグローバル一時テーブルの違いは何ですか?
私はこの説明が非常に明確だと思います(それは Technet からの純粋なコピーです):
一時テーブルには、ローカルとグローバルの2つのタイプがあります。ローカル一時テーブルは、テーブルが最初に作成または参照されたときと同じSQL Serverのインスタンスへの接続中に、作成者にのみ表示されます。ユーザーがSQL Serverのインスタンスから切断すると、ローカル一時テーブルが削除されます。グローバル一時テーブルは、作成後にすべてのユーザーとすべての接続に表示され、テーブルを参照しているすべてのユーザーがSQL Serverのインスタンスから切断されると削除されます。
テーブル変数(DECLARE @t TABLE
)は、それを作成した接続にのみ表示され、バッチまたはストアドプロシージャが終了すると削除されます。
ローカル一時テーブル(CREATE TABLE #t
)は、それを作成した接続にのみ表示され、接続が閉じられると削除されます。
グローバル一時テーブル(CREATE TABLE ##t
)はすべてのユーザーに表示され、それらを参照しているすべての接続が閉じられると削除されます。
Tempdb永続テーブル(USE tempdb CREATE TABLE t
)はすべてのユーザーに表示され、サーバーの再起動時に削除されます。
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接続にのみ表示されます。
Books Onlineからの引用:
ローカル一時テーブルは、現在のセッションでのみ表示されます。グローバル一時テーブルはすべてのセッションに表示されます。
一時テーブルは、DROP TABLEを使用して明示的に削除しない限り、スコープから外れると自動的に削除されます。
データベーススコープのグローバル一時テーブル (現在、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'