2010-09-22 11 views
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) 

回答

12

你試過:

DECLARE @UseTVP int 
    SET @UseTVP = (SELECT COUNT(*) FROM @TVP) 

    SELECT TOP 1 * 
     FROM dbo.SomeTable tbl 
      LEFT JOIN @TVP tvp 
       ON tbl.SomeVar = tvp.SomeVar 
     WHERE (tvp.SomeVar IS NOT NULL 
       OR @UseTVP = 0) 
+0

所以,如果我不是在查詢過程中使用TVP是什麼?那麼它將永遠是空的,我會得不到結果,對吧?我如何使TVP可選? – Brett 2010-09-22 18:59:13

+0

@Brett:我現在明白你的觀點。回到繪圖板。 – 2010-09-22 19:09:21

+0

@Brett:我編輯了我的答案。不知道這是否比你已經嘗試過的更好。 – 2010-09-22 19:24:03