优化SQL 2008全文查询(CONTAINSTABLE)
我得到了以下查询,它使用全文索引在给定商店(由@ShopId变量填充)中搜索与查询匹配的前5个产品(来自RawProducts表)。目前,我正在为每个ShopId(共有27家店铺)反复调用此过程,这有点慢 我的问题是-有人能告诉我如何修改查询以接受@ShopId变量中以逗号分隔的ShopId列表,并返回每个店铺的前5个匹配项吗 以下是到目前为止的问题:优化SQL 2008全文查询(CONTAINSTABLE),sql,sql-server,tsql,sql-server-2008,full-text-search,Sql,Sql Server,Tsql,Sql Server 2008,Full Text Search,我得到了以下查询,它使用全文索引在给定商店(由@ShopId变量填充)中搜索与查询匹配的前5个产品(来自RawProducts表)。目前,我正在为每个ShopId(共有27家店铺)反复调用此过程,这有点慢 我的问题是-有人能告诉我如何修改查询以接受@ShopId变量中以逗号分隔的ShopId列表,并返回每个店铺的前5个匹配项吗 以下是到目前为止的问题: DECLARE @ShopId uniqueidentifier SET @ShopId = '49506541-4ce2-40ac-812a-
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
您可以在调用proc之前创建一个临时表,并用shopID填充它。您必须通过与该临时表进行联接来修改查询您完全可以按照您的建议执行:
- 将以逗号分隔的标识符列表传递给存储过程
- 将逗号分隔的列表转换为临时表(或表变量)
- 将查询更改为此筛选器表上的联接
但由于您使用的是SQL Server 2008,因此我建议您使用XML数据类型:
- 编写小XML并将其传递到此存储过程:
- 将存储过程的参数更改为
@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表视图的结果上进行连接,但它的可读性稍差。UDF通常更快,而XML替代方法可以在SQL Server 2005上使用。