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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:20:26