Во-первых, ваша длина ввода 10 выглядит так, как будто вы не ожидаете (или не принимаете) отрицательных значений. Нижняя граница для int -2147483648, которая будет представлена 11-символьной строкой.
Основываясь на коде диджея сверху, я предлагаю вам поставить вызов ISNUMERIC () перед преобразованием / сравнением.
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' на самом деле работает, так как ввод усекается.