9
我正在構建一個查詢,其中有一些可選參數,其中一些是表值參數。我面臨的問題是如何在這個查詢中最有效地使用TVP?有條件Where語句對錶值參數?
每個TVP的類型是:
TABLE([variable] nvarchar(30))
我知道我可以通常爲:
INNER JOIN @TVP
過濾掉任何不是在TVP名單,但如果我決定不在我的查詢中將任何值傳遞給TVP?那麼什麼都不會返回(內部的,因爲加入)
通常這與條件WHERE語句來完成:
WHERE (SomeVar = @SameVar OR @SameVar IS NULL)
但是,與TVP,它不能是空的(至少不是我發現)我發現做到這一點
一種方法是:
OUTER APPLY
(SELECT TOP(1) * from dbo.SomeTable tbl where tbl.SomeVar in
(select * from @TVP) or not exists (select * from @TVP)
AND tbl.SomeVar = SomeVar)
不幸的是這種方法是horridly慢
另外,我已經試過:
WHERE (tbl.SomeVar in (SELECT * FROM @TVP) or not exists (SELECT * from @TVP))
這是速度更快,但我還是覺得它可能不是很理想
任何幫助或想法將不勝感激!事先讓我知道如果我能澄清什麼....謝謝
編輯:
所以,我想出了這一點,除非有人有更好的解決方案可能會使用它:
INNER JOIN @TVP tvp
ON (tvp.SomeVar = tbl.SomeVar or tvp.SomeVar is null)
所以,如果我不是在查詢過程中使用TVP是什麼?那麼它將永遠是空的,我會得不到結果,對吧?我如何使TVP可選? – Brett 2010-09-22 18:59:13
@Brett:我現在明白你的觀點。回到繪圖板。 – 2010-09-22 19:09:21
@Brett:我編輯了我的答案。不知道這是否比你已經嘗試過的更好。 – 2010-09-22 19:24:03