You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用SQL Server的CONTAINS函数在列中搜索多值?

SQL Server中CONTAINS函数是否支持多值列表搜索?

我创建了包含搜索项的临时表:

DROP TABLE IF EXISTS #searchitems

SELECT 'Road' as item
INTO #searchitems
UNION 
SELECT 'Bike'

搜索项为Road和Bike,已给Name列创建全文索引,尝试用以下语句查询包含这些项的数据行:

SELECT Name
FROM [AdventureWorksLT2019].[SalesLT].[Product]
WHERE CONTAINS(*, (Select item FROM #searchitems) )

但执行失败,单个值时可正常运行,期望实现类似以下语句的效果:

SELECT distinct Name
FROM [AdventureWorksLT2019].[SalesLT].[Product]
WHERE CONTAINS(*, 'Road OR Bike' )

解答

CONTAINS函数本身不直接支持传入多值列表作为搜索参数,它要求第二个参数是符合全文搜索语法的单个字符串(比如用OR/AND连接的搜索项组合)。要实现从临时表取多值搜索的需求,可以用以下两种方案:

方案1:动态SQL拼接搜索字符串

将临时表中的搜索项拼接成"Road" OR "Bike"格式的字符串,再传入CONTAINS:

DECLARE @SearchString NVARCHAR(MAX)

-- SQL Server 2017及以上版本用STRING_AGG拼接
SELECT @SearchString = STRING_AGG(QUOTENAME(item, '"'), ' OR ')
FROM #searchitems

-- 执行动态查询
EXEC sp_executesql N'
SELECT DISTINCT Name
FROM [AdventureWorksLT2019].[SalesLT].[Product]
WHERE CONTAINS(*, @SearchStr)
', N'@SearchStr NVARCHAR(MAX)', @SearchStr = @SearchString

如果是SQL Server 2016及更早版本,可改用FOR XML PATH拼接字符串:

DECLARE @SearchString NVARCHAR(MAX)
SELECT @SearchString = STUFF(
    (SELECT ' OR ' + QUOTENAME(item, '"') 
     FROM #searchitems 
     FOR XML PATH('')), 1, 4, ''
)

EXEC sp_executesql N'
SELECT DISTINCT Name
FROM [AdventureWorksLT2019].[SalesLT].[Product]
WHERE CONTAINS(*, @SearchStr)
', N'@SearchStr NVARCHAR(MAX)', @SearchStr = @SearchString

方案2:通过JOIN关联临时表

不需要拼接字符串,直接将产品表与临时表通过CONTAINS关联:

SELECT DISTINCT p.Name
FROM [AdventureWorksLT2019].[SalesLT].[Product] p
INNER JOIN #searchitems s 
    ON CONTAINS(p.*, s.item)

这种方式逻辑更直观,但如果临时表中搜索项数量较多,性能可能不如方案1(因为需要对每个搜索项单独执行一次CONTAINS匹配)。


内容的提问来源于stack exchange,提问作者Petersselorse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 23:25:19