違いは何ですか:
CREATE TABLE #temp ( [ID] INT)
INSERT INTO #temp
SELECT ...
と
DECLARE @temp TABLE ( [ID] INT)
INSERT @temp
SELECT ...
SQL Server 2008では?
違いは何ですか:
CREATE TABLE #temp ( [ID] INT)
INSERT INTO #temp
SELECT ...
と
DECLARE @temp TABLE ( [ID] INT)
INSERT @temp
SELECT ...
SQL Server 2008では?
一時テーブルは、現在のデータベースではなくTempDBに入り、限定されたスコープの後に消えることを除いて、ほとんどの特性で通常のテーブルに似ています(セッションベースかグローバル一時テーブルかによって異なります。ただし、一時テーブルのデータに対するすべての変更はトランザクションログに記録され、それに伴うすべてのパフォーマンスへの影響があります。otoh、通常のテーブルとまったく同じように、一時テーブルに必要な数のインデックス、ビュー、トリガー、またはその他のものを追加することもできます。
テーブル変数は、一種のショートカットインメモリテーブルです(一時DBも使用します)。それらへの変更はログに記録されません(これによりパフォーマンスが向上します)。ただし、それらのインデックスは1つしか取得できません(最初の宣言ステートメントの後にインデックスを作成できないため、テーブル変数に作成できるインデックスは、最初のテーブル変数宣言に含めることができるインデックスのみです...
Declare @Tab Table (myKey integer Primary Key Not Null, data varchar(20))
これらの特性のため、一時テーブルは大きなテーブル(幅が広く行が多い)や、存続期間中に複数のアクセスパターンが発生するテーブルに適していますが、テーブル変数は非常に狭いテーブルが必要な場合に最適です(キーのみのテーブル、またはデータ列が1つしかないキー)。これは、常にそのインデックス付きキーによってアクセスされます。
これは、さまざまな一時テーブルに関するかなり良いリファレンスです。
詳細については、このトピックを参照してください。
テーブル変数には明確に定義されたスコープがあります。それらはバッチ(つまり、ステートメントの現在のバッチ)の最後に自動的にクリアされますが、一時テーブルは現在のセッションとネストされたストアドプロシージャに表示されます。グローバル一時テーブルは、すべてのセッションに表示されます。
テーブル変数は、Declareステートメントを使用して作成されます。ステートメントを使用してテーブル変数を作成することはできません
select * into @tableVariableName
ただし、Createtableステートメントとステートメントを使用して一時テーブルを作成できます。
select * into #tempTableName
SQL Server 2008以降では、テーブル変数をパラメーターとしてストアドプロシージャに渡すことができます。ただし、一時テーブルをパラメータとしてストアドプロシージャに渡すことはできません。
UDF(ユーザー定義関数)内でテーブル変数を使用することはできますが、UDF内で一時テーブルを使用することはできません。