首先,您的輸入長度爲10看起來像你不期望(或接受)負值。 int的下界是-2147483648,它將用11個字符的字符串表示。
從上面的DJ代碼構建而來,我建議你在CONVERT /比較之前放置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」的實際工作,因爲輸入被截斷。
預期的結果是存儲過程不會返回任何行,而不是在我的數據庫讀取器中導致異常,但是我只是按照gbn的建議在客戶端上做更多的驗證。 – TheMissingLINQ 2009-04-14 16:16:12