SQL SERVER 存储过程中字符串定义产生的影响原创
金蝶云社区-依然如昨
依然如昨
5人赞赏了该文章 114次浏览 未经作者许可,禁止转载编辑于2024年03月05日 11:00:19

       近期在SQL SERVER里添加了一个存储过程,有几个输入参数,其中一个是接收车间名称,作为模糊(LIKE)过滤条件。但是在测试过程中,返回的结果这个过滤条件一直不起作用,在后端控制台看到调用这个存储过程时车间名称确实作为参数传递给了存储过程,但是却返回了所有车间数据。开始排查:

(1)用EXEC 直接执行存储过程,给了“车间名称”参数传递了值,发现过滤条件有作用,结果只返回了本车间的数据。说明SELECT语句没问题。

(2)是否在配置参数中错配了数据库名,导致调用的是旧的存储过程代码?——结果排除!

    那么参数传递到存储过程后到底发生了什么?试着把程序运行后储存过程接收后的变量内容存储到一个字段中,然后惊奇的发现内容居然是空!所有过滤条件里 LIKE '%'+车间名称+'%'就返回了所有车间数据。可是到底为什么明明在后台控制台看到已经车间名称(非空)传递给了存储过程,而且任何错误也没报!?

    后来仔仔细细查看了存储过程,终于发现变量定义是:DECLARE @WORKSHOPNAME VARCHAR ,没有给定VARCHAR的长度(因为参数比较多,打字太快略过去了),改成DECLARE @WORKSHOPNAME VARCHAR(50)后结果终于对了!

   查了一下SQL SERVER里定义一个VARCHAR类型的变量,可以不输入长度,语法没问题(所以存储过程建立、运行都没报错),但其实默认长度是1个字符,但是调用时前端输入的“车间名称”都是汉字,一个汉字占两个字符,所以就无法保存到变量里。不设定长度,你SET @WORKSHOPNAME='1’,或者SET @WORKSHOPNAME='A'都是可以保存的。

    但是这里有一个问题:为什么在SSMS里直接EXEC 存储过程给定参数值怎么就保存到没给定长度的VARCHAR变量里了呢?哪位了解的希望能给个解答,谢谢!

   这个错误,记录一下!

赞 5