SQL Server 2012:具有返回零行的变量的查询

SQL Server 2012:具有返回零行的变量的查询,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,当我硬编码值时,此查询以所需方式返回输出,但当我使用@PAYMENT\u凭证\u NUMBER变量而不是硬编码数据“REVIEW\u PAYMENT\u凭证\u 31”时,它不会返回任何行 /* Not working */ DECLARE @PAYMENT_VOUCHER_NUMBER VARCHAR(15) = NULL; Set @PAYMENT_VOUCHER_NUMBER ='REVIEW_PAYMENT_VOUCHER_31'; SELECT REF_NUM ,CASE

当我硬编码值时,此查询以所需方式返回输出,但当我使用@PAYMENT\u凭证\u NUMBER变量而不是硬编码数据“REVIEW\u PAYMENT\u凭证\u 31”时,它不会返回任何行

/* Not working */ 
DECLARE @PAYMENT_VOUCHER_NUMBER VARCHAR(15) = 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 LIKE @PAYMENT_VOUCHER_NUMBER
    OR ML_PT_VOUCHER_NUMBER LIKE @PAYMENT_VOUCHER_NUMBER;

/* End of not working section */

/* This works fine */ 
SELECT REF_NUM
    ,CASE 
        WHEN RW_PT_VOUCHER_NUMBER = 'REVIEW_PAYMENT_VOUCHER_31'
            THEN 1
        WHEN ML_PT_VOUCHER_NUMBER = 'REVIEW_PAYMENT_VOUCHER_31'
            THEN 2
        END FEE_TYPE
FROM PROC_FEES_PYMTS
WHERE RW_PT_VOUCHER_NUMBER LIKE 'REVIEW_PAYMENT_VOUCHER_31'
    OR ML_PT_VOUCHER_NUMBER LIKE 'REVIEW_PAYMENT_VOUCHER_31';
架构信息:

PROC_FEES_PYMTS -Table
REF_NUM - [varchar](15) NOT NULL
RW_PT_VOUCHER_NUMBER - [varchar](100) NULL
ML_PT_VOUCHER_NUMBER - [varchar](100) NULL
理想情况下,这应该返回一行。但当使用变量时,它不会返回任何行

/* Not working */ 
DECLARE @PAYMENT_VOUCHER_NUMBER VARCHAR(15) = 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 LIKE @PAYMENT_VOUCHER_NUMBER
    OR ML_PT_VOUCHER_NUMBER LIKE @PAYMENT_VOUCHER_NUMBER;

/* End of not working section */

/* This works fine */ 
SELECT REF_NUM
    ,CASE 
        WHEN RW_PT_VOUCHER_NUMBER = 'REVIEW_PAYMENT_VOUCHER_31'
            THEN 1
        WHEN ML_PT_VOUCHER_NUMBER = 'REVIEW_PAYMENT_VOUCHER_31'
            THEN 2
        END FEE_TYPE
FROM PROC_FEES_PYMTS
WHERE RW_PT_VOUCHER_NUMBER LIKE 'REVIEW_PAYMENT_VOUCHER_31'
    OR ML_PT_VOUCHER_NUMBER LIKE 'REVIEW_PAYMENT_VOUCHER_31';

这个变量有问题吗?或者我在这个查询中有错误吗?

当您将
'REVIEW\u PAYMENT\u conception\u 31'
加载到您得到的
varchar(15)
中时

“审核付款”

您的字符串被截断为15个字符。解决此问题的第一步是打印变量值


使用类似于
VARCHAR(100)
的方法来代替可变长度是问题所在。它无法容纳您提供的输入。为了安全起见,使用一些大数字或最大值。同样,对于like,您应该使用%符号或使用相等(=)运算符

DECLARE @PAYMENT_VOUCHER_NUMBER VARCHAR(MAX) = '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 like '%' + @PAYMENT_VOUCHER_NUMBER + '%' OR ML_PT_VOUCHER_NUMBER like '%' + @PAYMENT_VOUCHER_NUMBER + '%'

谢谢你的指导。你说得对。