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

SQL Server存储过程参数赋值异常:仅输出单个字符问题排查

问题:存储过程参数传递后仅打印单个字符的原因是什么?

我编写了如下存储过程:

alter procedure teste2_parts 
    (@date datetime null,
     @tableNameOrig varchar, 
     @tableNameDest varchar) 
as
    declare 
        @tableNameOrigName varchar(50), 
        @tableNameDestName varchar(50);
 
    set @tableNameOrigName = substring(@tableNameOrig, charindex('.', @tableNameOrig) + 1, len(@tableNameOrig))

    print @tableNameOrigName;
    print @tableNameOrig;

执行该存储过程的语句如下:

exec teste2_parts null, 'ods.teste_parts_target', 'ods.teste_parts_target_v2'

但打印结果仅为:

o
o

编辑补充:此前因未意识到是参数头部varchar长度问题,无法精准搜索相关解决方案。


原因分析与解决办法

问题的核心是存储过程参数声明时,varchar类型未指定长度。在SQL Server中,当仅写varchar而不指定长度时,默认长度为1。这导致你传入的完整字符串'ods.teste_parts_target'被自动截断,只保留了第一个字符'o'。

后续逻辑因此出错:

  • charindex('.', @tableNameOrig)返回0(仅字符'o'中找不到小数点)
  • substring(@tableNameOrig, 0 + 1, len(@tableNameOrig))等价于从第1位取1个字符,结果还是'o'

解决办法是给参数指定足够的长度,比如根据表名需求设置为varchar(100):

alter procedure teste2_parts 
    (@date datetime null,
     @tableNameOrig varchar(100), 
     @tableNameDest varchar(100)) 
as
    declare 
        @tableNameOrigName varchar(50), 
        @tableNameDestName varchar(50);
 
    set @tableNameOrigName = substring(@tableNameOrig, charindex('.', @tableNameOrig) + 1, len(@tableNameOrig))

    print @tableNameOrigName;
    print @tableNameOrig;

修改后,传入的完整字符串能被正确接收,后续字符截取逻辑也会正常工作。

内容的提问来源于stack exchange,提问作者Wiz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 23:57:28