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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 06:01:44