SQL Serverテーブル:@、#、##の違いは何ですか?


回答:


114

#table ローカル(作成したユーザーにのみ表示される)一時テーブルを参照します。

##table グローバル(すべてのユーザーに表示)一時テーブルを参照します。

@variableName 型に応じて値を保持できる変数を指します。


29
#tableの定義は完全に正しくありません。これはユーザーに限定されず、接続です。ユーザーが複数の接続を持っている場合、最初に#tableを作成した接続に対してのみ表示されます。
Davin Studer

@DavinStuderは重要な説明を提供しています。ユーザーに表示されるテーブルと現在の接続でのみ表示されるテーブルの違いは非常に重要です。
mirzmaster 2016

@DavinStuderユーザーの複数の接続をどのように表示しますか?同じ接続文字列?
Kiquenet

25

4
これはずっと前からのことだと思いますが、これはリンクのみの回答であるため(そして最初のリンクは無効です)、各リンクからの主な要点で更新できますか?
マイクガスリー

7

#そして##テーブルは一時データベースに代表される実際のテーブルです。これらのテーブルにはインデックスと統計を含めることができ、セッション内のsproc全体にアクセスできます(グローバル一時テーブルの場合、セッション間で利用できます)。

@tableはテーブル変数です。

詳細:http : //www.sqlteam.com/article/temporary-tables


4
また、テーブル変数は、サイズが大きすぎてメモリに保持できない場合、tempDBデータベースにも存在します。
marc_s 2010

6

#tableと@tableの違いに焦点を当てます。## tableはグローバルな一時テーブルであり、SQL Serverを使用して10年以上の記録として、有効なユースケースにまだ出会っていません。確かにいくつかは存在すると思いますが、オブジェクトの性質上、IMHOは非常に使い物になりません。

@marc_sによる@whinerへの応答は完全に真です。テーブル変数が常にメモリ内に存在するというのは一般的な神話です。テーブル変数がディスクに移動し、一時テーブルのように動作することは実際には非常に一般的です。

とにかく、@ Astanderによって指摘されたリンクをたどることによって、一連の相違点について読むことをお勧めします。ほとんどの違いには、@ table変数では実行できない制限があります。


計算のさまざまな部分を実行し、単一の結果を出力する5つの個別のストアドプロシージャがあります。監査については、中間値を見たいと思っています。監査人もそうです。## Tempテーブルにいくつかをダンプするように手順を調整して、両方を表示できるようにしましたが、それらは保持されません(これらは監査中にのみ必要です)。あなたにとって有効なユースケースがあります(IMHO!)。
RyanfaeScotland 2015年

@Ryanなぜdbo.Tableを使用できたのに## Tableが有効なのですか?DROPステートメントを入力する手間を省くことができれば、これは有効なユースケースとは見なしません。
アーロンベルトラン

4
監査人に自分のDBに対するDROP権限を与えたくありません。私はまた、彼が終わった後に戻って片付けたくありません。一時テーブルを使用すると、彼は好きなだけ何度でもクエリを実行できます。彼が完了したとき、彼はDBにフットプリントを残していません。
RyanfaeScotland 2015年

4
CREATE TABLE #t

そのCONNECTIONでのみ表示されるテーブルを作成します。そのCONNECTIONの間、別の接続を作成する同じユーザーは、他の接続からのテーブル#tを見ることができません。

CREATE TABLE ##t

他の接続から見える一時テーブルを作成します。ただし、接続の作成が終了すると、テーブルは削除されます。


SqlConnection.Open()同じ接続文字列同じ接続
Kiquenet

2
いいえ、同じデータベースへの接続ですが、ほぼ確実に同じ接続ではありません。
マーカス

0

一意のグローバル一時テーブルが必要な場合は、Uniqueidentifierプレフィックス/サフィックスを使用して独自のテーブルを作成し、if object_id(...)の場合はポスト実行をドロップします。唯一の欠点は、動的SQLを使用し、明示的にドロップする必要があることです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.