web-dev-qa-db-ja.com

#temptableと## TempTableの違いは?

SQL Serverの#temptable##TempTableの違いを説明してください。私はこれについてグーグルで調べましたが、答えが見つかりません。

これに関して私を助けてください

52
Vignesh Kumar A

「#tableはローカル(作成したユーザーのみが見ることができる)一時テーブルを指します。」

「## tableは、グローバル(すべてのユーザーに表示される)一時テーブルを指します。」

12
Rahul

#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 ##テーブルは、制御プロセスに作成されます。このプロセスに対するタスクがなくても、このプロセスがまだ生きている場合、テーブルは削除のフラグが立てられません。 ##テーブルが作成されたプロセスがなくなると、最後のタスクが実行されたときに、テーブルに削除のタグが付けられます。

それを見る簡単な方法は#テーブルは、それが作成されたプロセスのスコープでのみ使用可能です。##は、他のテーブルと同じ方法で利用できますが、作成されたプロセスに存在が存在するか、存在するかが異なります。

10
Michael Cooper

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

ここから取得

これについての詳細

7
SamuraiJack

簡単なテスト方法#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に対して選択クエリを実行すると、クエリ結果が返されます。

2
goofyui

テーブルは、それを作成したプロセス/接続が終了し、それを作成したセッションのみが終了するまで表示/使用可能になります。

テーブルはグローバルであり、テーブルを作成したプロセス/セッションが終了するまで誰でも利用できます。

0
agohil