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

存储过程中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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:18:54