2009-09-19 58 views
0

我已經得到以下查詢,它使用全文索引搜索匹配查詢的TOP 5產品(來自RawProducts表),在給定Shop中(由@ShopId變量)。目前,我一遍又一遍地爲每個ShopId(有27個商店)調用這個程序 - 這有點慢。優化SQL 2008全文查詢(CONTAINSTABLE)

我的問題是 - 誰能讓我知道如何修改查詢來接受@ShopId變量中ShopIds的逗號分隔列表,並返回每個店鋪的TOP 5匹配?

這裏的查詢到目前爲止:

DECLARE @ShopId uniqueidentifier 
SET @ShopId = '49506541-4ce2-40ac-812a-7ab262e6f0b0' 

    SELECT TOP 5 
      ftt.RANK, 
      rp.* 
    FROM RawProducts rp 
    JOIN CONTAINSTABLE(RawProducts, 
         RawProductName, 
         'ISABOUT("*radox*","*shower*")') AS ftt ON ftt.key = rp.RawProductId 
    WHERE rp.ShopId = @ShopId 
ORDER BY ftt.RANK DESC 

回答

2

你絕對可以做你的建議是什麼:

  • 通逗號分隔的標識符的列表存儲過程
  • 轉換逗號分隔列表到一個臨時表(或表變量)
  • 改變你的查詢,以便對這個過濾表

SQL User Defined Function to Parse a Delimited String的UDF上解析通訊一個分隔的列表。


不過既然你使用SQL Server 2008,那麼我建議你使用XML數據類型:

  • 組成的小XML並將它傳遞給這個存儲過程:<Filter><Row ID="1"/><Row ID="2"/></Filter>
  • 變化的參數你存儲過程到@FilterXML NVARCHAR(MAX)
  • 將輸入參數轉換爲XML,然後將其插入到表變量中(如下所示)
  • 在此選項卡上加入您的查詢樂變量之前

樣品:

CREATE PROCEDURE getMyData(@FilterXML NVARCHAR(MAX)) 
AS BEGIN 
    DECLARE @x XML 
    SELECT @x = CONVERT(XML, @FilterXML) 
    DECLARE @Filter TABLE (ShopID INT) 

    -- insert into temporary table 
    INSERT INTO @Filter (ShopID) 
    -- @important: XML iS CaSe-SenSiTiv 
    SELECT  x.value('@ID', 'INTEGER') 
    FROM  @x.nodes('/Filters/Row') AS R(x) 
    ... 

你甚至避免這種表變量@Filter和直接的XML表視圖的結果加入,但它是有點不太可讀。

+0

UDF通常速度更快,而XML替代方案可用於SQL Server 2005。 – 2009-09-19 21:13:49

0

你可以調用proc前面創建臨時表,填充它王氏shopIds。你必須做與臨時表聯接修改查詢