我的查询基于@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}}我收到了上述转换错误。
如何解决这个问题?
答案 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)
对于此类查询的重要性。