2012-01-19 32 views
1

在典型的存儲過程中,我正在使用與以下相同的查詢進行各種檢查。SQL Server 2005 - 用於存儲RowSet的變量的DataType

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

如果你只用一行或多行相對位 - 最好用索引而不是表變量創建臨時表。 Sql Server不會創建表變量的統計信息,並且不會創建臨時表 - 因此,臨時表可能會勝過表變量 –

1

這種形式是優選的(儘管優化器應執行該優化):

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

然後添加條件作爲WHERE子句(而不是執行內選擇,並試圖在一個變量專案編號的列表):

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