我有以下查询使用全文索引来搜索匹配查询的TOP 5产品(来自RawProducts表),在给定的Shop中(由@ShopId变量填充)。目前我正在为每个ShopId(有27家商店)一遍又一遍地调用这个程序 - 这有点慢。
我的问题是 - 是否有人可以让我知道如何修改查询以接受@ShopId变量中逗号分隔的ShopId列表,并从每个商店返回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
答案 0 :(得分:2)
你绝对可以做你的建议:
在解析以逗号分隔的列表时,请参阅SQL User Defined Function to Parse a Delimited String以获取UDF。
但是既然您使用的是SQL Server 2008,那么我建议您使用XML数据类型:
<Filter><Row ID="1"/><Row ID="2"/></Filter>
@FilterXML NVARCHAR(MAX)
样品:
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表视图的结果,但它的可读性稍差。
答案 1 :(得分:0)
你可以在调用proc之前创建一个临时表,用shopIds填充它。您必须通过与该临时表进行连接来修改查询