SQL Server存储过程报错:varchar值'%'转int失败
SQL Server存储过程类型转换错误排查与解决
错误根因
你遇到的Conversion failed when converting the varchar value '%' to data type int错误,本质是存储过程中对int类型的@BusNo参数使用了字符串匹配逻辑(比如拼接%或用LIKE)。当你传入@BusNo=NULL时,若代码里用了类似ISNULL(@BusNo, '%')的处理,int类型无法兼容字符串%,触发SQL Server的隐式类型转换,最终转换失败。
解决方案
1. 精确匹配BusNumber(常用场景)
如果需求是根据BusNumber精确搜索,直接用等于判断,NULL时跳过该条件:
CREATE PROCEDURE spGetAllBus @BusName NVARCHAR(100) = NULL, @BusNo INT = NULL AS BEGIN SET NOCOUNT ON; SELECT BusName, BusNumber FROM Bus WHERE -- 处理BusName模糊搜索,NULL时匹配所有 (BusName LIKE '%' + ISNULL(@BusName, '') + '%') -- 处理BusNumber精确搜索,NULL时跳过该条件 AND (BusNumber = @BusNo OR @BusNo IS NULL) END
2. 模糊匹配BusNumber(特殊需求)
如果需要支持“搜索包含某数字的BusNumber”,必须先把int类型的BusNumber转为字符串,再做LIKE匹配:
CREATE PROCEDURE spGetAllBus @BusName NVARCHAR(100) = NULL, @BusNo INT = NULL AS BEGIN SET NOCOUNT ON; SELECT BusName, BusNumber FROM Bus WHERE (BusName LIKE '%' + ISNULL(@BusName, '') + '%') AND ( -- 先转字符串再模糊匹配,NULL时匹配所有 CAST(BusNumber AS NVARCHAR(20)) LIKE '%' + ISNULL(CAST(@BusNo AS NVARCHAR(20)), '') + '%' OR @BusNo IS NULL ) END
注意事项
- 杜绝隐式类型转换:SQL Server中int类型优先级高于varchar,会优先尝试把字符串转为int,而非反过来,这是错误的核心原因。
- 类型一致性:使用
ISNULL/COALESCE处理NULL时,要保证替换值的类型和原参数一致。 - 性能提示:如果BusNumber列数据量大,转字符串后使用LIKE会无法利用索引,若对性能有要求,建议提前规划字符串类型的数字存储字段。
内容的提问来源于stack exchange,提问作者Niranjan godbole
相关产品推荐
相关产品推荐

