SQL Server 2012:使用变量的查询返回零行问题排查
问题根源:变量长度被截断导致匹配失败
这问题我碰到过好几次了,核心原因其实很简单——你定义的变量长度不够,导致赋值时目标字符串被截断了!
仔细看你的代码细节:
- 你把
@PAYMENT_VOUCHER_NUMBER定义成了VARCHAR(15),但你要赋值的字符串'REVIEW_PAYMENT_VOUCHER_31'实际长度有25个字符左右。 - 当SQL Server执行赋值操作时,会自动截断超出变量长度的部分,最终变量里存的是
'REVIEW_PAYMENT_'(刚好15个字符),用这个不完整的字符串去匹配表中完整的字段值,当然查不到任何结果。
快速修复方案
把变量的长度改成和表字段一致的VARCHAR(100)(或者至少足够容纳目标字符串),修改后的代码如下:
DECLARE @PAYMENT_VOUCHER_NUMBER VARCHAR(100) = NULL; Set @PAYMENT_VOUCHER_NUMBER ='REVIEW_PAYMENT_VOUCHER_31'; SELECT REF_NUM ,CASE WHEN RW_PT_VOUCHER_NUMBER = @PAYMENT_VOUCHER_NUMBER THEN 1 WHEN ML_PT_VOUCHER_NUMBER = @PAYMENT_VOUCHER_NUMBER THEN 2 END FEE_TYPE FROM PROC_FEES_PYMTS WHERE RW_PT_VOUCHER_NUMBER = @PAYMENT_VOUCHER_NUMBER OR ML_PT_VOUCHER_NUMBER = @PAYMENT_VOUCHER_NUMBER;
另外提个小建议:因为你这里是精确匹配(没有用%通配符),完全可以把LIKE换成=,这样语义更清晰,查询效率也会更高。
验证截断问题的方法
如果你想确认确实是截断导致的问题,可以运行下面的测试语句:
DECLARE @PAYMENT_VOUCHER_NUMBER VARCHAR(15) = NULL; Set @PAYMENT_VOUCHER_NUMBER ='REVIEW_PAYMENT_VOUCHER_31'; SELECT @PAYMENT_VOUCHER_NUMBER AS Truncated_Value, LEN(@PAYMENT_VOUCHER_NUMBER) AS Value_Length, LEN('REVIEW_PAYMENT_VOUCHER_31') AS Original_Length;
执行后你会看到:变量的实际长度是15,远小于原字符串的长度,这就坐实了截断的问题。
内容的提问来源于stack exchange,提问作者Er. Āridy
相关产品推荐
相关产品推荐

