SQL Serverの#temptable
と##TempTable
の違いを説明してください。私はこれについてグーグルで調べましたが、答えが見つかりません。
これに関して私を助けてください
「#tableはローカル(作成したユーザーのみが見ることができる)一時テーブルを指します。」
「## tableは、グローバル(すべてのユーザーに表示される)一時テーブルを指します。」
#TempTables
は、ユーザーまたは接続に対してローカルなだけではありません。それらは、それを作成したプロセスおよび作成プロセスが生成するプロセスに対してローカルです。私の例は次のとおりです。
Declare @strDynamicSQL as varchar(8000)
Set @strDynamicSQL = 'Select GetDate() As TheDate Into #TheDateTable'
Execute(@strDynamicSQL)
Select *
From #TheDateTable
次のエラーが表示されます。
メッセージ208、レベル16、状態0、行7無効なオブジェクト名 '#TheDateTable'。
しかし、私がそうするなら:
Declare @strDynamicSQL as varchar(8000)
Create Table #TheDateTable (
TheDate DateTime
)
Set @strDynamicSQL = 'Insert Into #TheDateTable Select GetDate() As TheDate'
Execute(@strDynamicSQL)
Select *
From #TheDateTable
エラーは発生しません。
最初の例では、Execute
ステートメントは生成されたプロセスで発生します。テーブルは、そのプロセスが返されるとそのプロセスで作成されるため、そのプロセスはなくなります。そして、プロセスでは、テーブルは「バイバイ」です。
2番目の例では、テーブルは最上位プロセスによって作成されます。その後、生成されたプロセスで相互作用します。テーブルは、それが作成されたプロセス、およびそれが生成するプロセスに使用できます。
##tables
これを破る。プロセスa ##
テーブルは、制御プロセスに作成されます。このプロセスに対するタスクがなくても、このプロセスがまだ生きている場合、テーブルは削除のフラグが立てられません。 ##テーブルが作成されたプロセスがなくなると、最後のタスクが実行されたときに、テーブルに削除のタグが付けられます。
それを見る簡単な方法は#
テーブルは、それが作成されたプロセスのスコープでのみ使用可能です。##
は、他のテーブルと同じ方法で利用できますが、作成されたプロセスに存在が存在するか、存在するかが異なります。
簡単なテスト方法#localtable and ##globaltable
別のSQLクエリウィンドウでこれを試してください
create table ##globaltemptable (id int )
go
insert into ##globaltemptable values (1)
go
select * from ##globaltemptable
別のSQLクエリウィンドウでこれを試してください
create table #localtemptable (id int )
go
insert into #localtemptable values (1)
go
select * from #localtemptable
ここで、グローバルウィンドウ構文でテーブル:#localtemptableに対して選択クエリを実行すると、次のようなエラーが表示されます。
Invalid object name '#localtemptable'.
同じセッションの任意のクエリウィンドウで、テーブル## globaltemptableに対して選択クエリを実行すると、クエリ結果が返されます。
テーブルは、それを作成したプロセス/接続が終了し、それを作成したセッションのみが終了するまで表示/使用可能になります。
テーブルはグローバルであり、テーブルを作成したプロセス/セッションが終了するまで誰でも利用できます。