基于多LIKE语句的文本搜索存储过程(不使用全文搜索)
解决方案:动态生成多条件LIKE查询的存储过程
这里是适配SQL Server场景的存储过程实现,它能接收逗号分隔的属性列表,自动拆分后生成对应的AND LIKE查询逻辑,完全匹配你的需求:
CREATE PROCEDURE SearchFor @Attributes NVARCHAR(MAX) AS BEGIN SET NOCOUNT ON; -- 处理空参数:如果没传入有效属性,直接返回所有商品 IF @Attributes IS NULL OR LTRIM(RTRIM(@Attributes)) = '' BEGIN SELECT * FROM GoodInfo; RETURN; END -- 初始化动态SQL框架 DECLARE @DynamicSQL NVARCHAR(MAX) = 'SELECT * FROM GoodInfo WHERE 1=1'; DECLARE @Attribute NVARCHAR(255); -- 拆分属性列表并过滤空项(比如用户输入`Watch,,LED Screen`的情况) DECLARE AttributeCursor CURSOR FOR SELECT LTRIM(RTRIM(value)) AS Attribute FROM STRING_SPLIT(@Attributes, ',') WHERE LTRIM(RTRIM(value)) <> ''; OPEN AttributeCursor; FETCH NEXT FROM AttributeCursor INTO @Attribute; -- 遍历每个属性,拼接LIKE条件 WHILE @@FETCH_STATUS = 0 BEGIN -- 转义单引号避免SQL语法错误和注入风险 SET @DynamicSQL = @DynamicSQL + ' AND Description LIKE ''%' + REPLACE(@Attribute, '''', '''''') + '%'''; FETCH NEXT FROM AttributeCursor INTO @Attribute; END CLOSE AttributeCursor; DEALLOCATE AttributeCursor; -- 执行生成的动态SQL EXEC sp_executesql @DynamicSQL; END
关键细节说明
- 空参数防护:如果传入的属性列表为空或全是空格,直接返回所有商品,避免生成无效SQL。
- 字符串拆分:使用
STRING_SPLIT函数(SQL Server 2016及以上版本支持)快速拆分逗号分隔字符串,同时过滤掉空的属性项。 - SQL注入防护:通过
REPLACE转义属性中的单引号,避免恶意输入破坏SQL语法或注入攻击。 - 动态逻辑生成:用游标遍历每个属性,自动拼接
AND Description LIKE '%属性值%'的条件,不管传入多少个属性都能适配。
使用示例
调用方式完全符合你的要求:
EXEC SearchFor 'Watch,Water Proof,LED Screen,Digital';
这个存储过程会自动生成并执行如下SQL:
SELECT * FROM GoodInfo WHERE 1=1 AND Description LIKE '%Watch%' AND Description LIKE '%Water Proof%' AND Description LIKE '%LED Screen%' AND Description LIKE '%Digital%'
兼容旧版本SQL Server(可选)
如果你的SQL Server版本低于2016(不支持STRING_SPLIT),可以替换拆分逻辑为自定义表值函数,比如用循环拆分字符串的方式,再替换游标中的查询部分即可。
内容的提问来源于stack exchange,提问作者Muhammad Musavi
相关产品推荐
相关产品推荐

