2009-09-19 68 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。你必须做与临时表联接修改查询