首先,您的输入长度 10 看起来您不期望(或接受)负值。 int 的下限是 -2147483648,它将由 11 个字符的字符串表示。
基于上面 DJ 的代码,我建议您将 ISNUMERIC() 调用放在 CONVERT/compare 之前。
IF ISNUMERIC(@Criteria) = 1
AND CONVERT(bigint, @Criteria) <= 2147483647
SET @Id = CONVERT(int, @Criteria)
这首先转换为 bigint,然后进行比较。以下是一些测试用例:
DECLARE @Id int
DECLARE @Criteria varchar(10)
PRINT 'Expect failure (NULL)'
SET @Criteria = '2147483648'
SET @Id = NULL
IF ISNUMERIC(@Criteria) = 1
AND CONVERT(bigint, @Criteria) <= 2147483647
SET @Id = CONVERT(int, @Criteria)
SELECT @Id AS '@Id', @Criteria AS '@Criteria', CONVERT(bigint, @Criteria) AS 'Converted to bigint'
PRINT 'Expect success'
SET @Criteria = '2147483647'
SET @Id = NULL
IF ISNUMERIC(@Criteria) = 1
AND CONVERT(bigint, @Criteria) <= 2147483647
SET @Id = CONVERT(int, @Criteria)
SELECT @Id AS '@Id', @Criteria AS '@Criteria', CONVERT(bigint, @Criteria) AS 'Converted to bigint'
PRINT 'Expect failure but get success because @Criteria is truncated to 10 characters'
SET @Criteria = '11111111111111111111'
SET @Id = NULL
IF ISNUMERIC(@Criteria) = 1
AND CONVERT(bigint, @Criteria) <= 2147483647
SET @Id = CONVERT(int, @Criteria)
SELECT @Id AS '@Id', @Criteria AS '@Criteria', CONVERT(bigint, @Criteria) AS 'Converted to bigint'
和结果:
Expect failure (NULL)
@Id @Criteria Converted to bigint
----------- ---------- --------------------
NULL 2147483648 2147483648
Expect success
@Id @Criteria Converted to bigint
----------- ---------- --------------------
2147483647 2147483647 2147483647
Expect failure but get success because @Criteria is truncated to 10 characters
@Id @Criteria Converted to bigint
----------- ---------- --------------------
1111111111 1111111111 1111111111
请注意,由于输入被截断,因此传递 '11111111111111111111' 实际上有效。