2012-01-19 14 views
1

私が働いている典型的なストアドプロシージャでは、以下と同じクエリでさまざまなチェックが行われます。SQL Server 2005 - RowSetを格納する変数のデータ型

SELECT ... FROM Projects WHERE ProjectId IN (SELECT ProjectId FROM Tasks) 

私はvariableでクエリ(SELECT ProjectId FROM Tasks)を交換したいが、それがために持っているものdatatypeへと混乱しています。 あなたはを知っていますか?また、この結果をキャッシュすることは有害であるか、これを行うためのより簡単な方法です。

答えて

1

あなたは、テーブル変数を入力したcteateし、それを複数回使用することができ、そのような:

CREATE @Projects TABLE(Id INT NOT NULL) 

INSERT @Projects SELECT ProjectId FROM Tasks 

SELECT ... FROM Projects WHERE ProjectId IN (SELECT ProjectId FROM @Projects) 
SELECT ... FROM Projects WHERE ProjectId NOT IN (SELECT ProjectId FROM @Projects) 

Althought - それは変数でクエリの交換ないが、それはこれはあなたのクエリのパフォーマンスが低下する可能性があり、一定の条件の下でより多くの再利用可能なサブクエリの結果

しかし

作るです

+0

特定のものを条件?あなたはいくつかを追加することができます – Deeptechtons

+0

テーブルの変数の代わりにインデックスを使ってtempテーブルを作成するのは、1回だけまたは比較的少ない行の量を使用する場合です。 SQL Serverはテーブル変数の統計情報を作成せず、一時テーブルを作成しません - したがって、一時テーブルはテーブル変数より優れている可能性があります –

1

このフォームは、(オプティマイザは、この最適化を実行する必要が)好ましい。

SELECT ... FROM Projects p 
INNER JOIN Tasks t ON t.ProjectID = p.ProjectId 

次にWHERE句(代わりの内側選択を実行し、変数にPROJECTID者のリストを配置しようとするように条件を追加):

SELECT ... FROM Projects p 
INNER JOIN Tasks t ON t.ProjectID = p.ProjectId 
WHERE someCondtionOnTasksTable 
関連する問題