转换varchar值时转换失败'%'到数据类型int错误

时间:2017-02-06 09:56:40

标签: sql sql-server sql-server-2012

我的查询基于@Amount参数

Amount varchar(20)= NULL

SELECT .....
    Format(T1.Amount, 'c', 'en-us') as Amount1, 
    Format(T2.Amount, 'c', 'en-us') as Amount2
FROM Table1
WHERE  .....
    AND (T1.Amount>= CAST(@Amount AS INT) OR T2.Amount >= CAST(@Amount AS INT)) 
    AND @Amount IS NOT NULL

如果@Amount参数不是NULL 且数字,则查询效果很好,但@Amount参数为'%'或{ {1}}我收到了上述转换错误。

如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

检查值是否为数字的简单方法:

DECLARE @Amount VARCHAR(20)= '23';

IF ISNUMERIC(@Amount) = 0
    BEGIN   
        PRINT 'Amount is null or is not a number';
    END;
ELSE
    BEGIN
        PRINT 'Amount: ' + @Amount;
    END; 

WHERE子句中执行此操作:

DECLARE @Amount VARCHAR(20)= '23';

SELECT 'Some Data' AS Result
WHERE ISNUMERIC(@Amount) = 1 AND @Amount > 0

答案 1 :(得分:0)

为什么不为int参数使用正确的@Amount类型? 为什么使用varchar

我会设置@Amount参数int的类型并传递实际值或NULL。传递NULL表示应忽略此参数。

@Amount int = NULL

SELECT .....
    Format(T1.Amount, 'c', 'en-us') as Amount1, 
    Format(T2.Amount, 'c', 'en-us') as Amount2
FROM 
    T1 ... JOIN T2 ...
WHERE  
    .....
    AND (@Amount IS NULL OR T1.Amount >= @Amount OR T2.Amount >= @Amount) 
OPTION (RECOMPILE)

此类查询称为Dynamic Search Condition。我建议阅读Erland Sommarskog的这篇文章,详细解释以及OPTION (RECOMPILE)对于此类查询的重要性。