存储过程中LIKE函数参数传递问题求助
问题分析与解决方案
你遇到的核心问题是存储过程中LIKE子句的参数引用方式错误,导致SQL把%@Name当成了固定字符串,而非替换成你传入的@Name变量值,自然匹配不到任何数据。另外还有一个容易忽略的细节:CTE定义后必须立即查询使用,不然存储过程不会返回结果。
错误根源
你写的WHERE Name like '%@Name'里,%@Name是一个字面量字符串,SQL会去匹配名字以@Name结尾的记录,而不是以你传入的参数值结尾的记录,这就是为什么单独执行WITH AS语句正常,但存储过程返回0行的原因。
修复后的存储过程代码
这里提供两种安全且正确的写法,既能避免SQL注入风险,又能正确引用参数:
方法1:字符串拼接(适配多数SQL Server版本)
CREATE PROCEDURE test @Name varchar(200) AS WITH n(Surname, Name) AS ( SELECT Surname, Name FROM [dbo].[phonebook] WHERE Name LIKE '%' + @Name -- 将通配符与参数拼接 ) SELECT * FROM n; -- 必须查询CTE才能返回结果
方法2:使用CONCAT函数(更简洁,SQL Server 2012+支持)
CREATE PROCEDURE test @Name varchar(200) AS WITH n(Surname, Name) AS ( SELECT Surname, Name FROM [dbo].[phonebook] WHERE Name LIKE CONCAT('%', @Name) -- 用CONCAT函数拼接通配符与参数 ) SELECT * FROM n;
额外提示
- 如果你的匹配需求是“以参数开头”(
@Name%)或者“包含参数”(%@Name%),只需要调整通配符的位置即可。 - 调用存储过程时,确认传入的
@Name参数值没有多余空格或格式错误,避免影响匹配结果。
内容的提问来源于stack exchange,提问作者Tester
相关产品推荐
相关产品推荐

