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
相关产品推荐
相关产品推荐

