一開始的時候用如下代碼:
alter proc getSerialNO @TYPE VARCHAR(2), @serialNO VARCHAR(10) OUTPUT AS if (upper(@type) ='TR') begin select @serialNO = SERIALNO from tb_trserialno set @serialNO = @serialNO + 1 update tb_trserialno set SERIALNO = @serialNO ,LASTUPDATE = CONVERT(VARCHAR,GETDATE(),120) end
結果報錯:
轉換 varchar 值 '4000000001' 時溢出了整數列。
分析:
set @serialNO = @serialNO + 1 這條語句被執行時,數據庫應該試圖將 @serialNO 轉換為默認的int來進行 +1操作,轉換發生了異常!
網上查資料得知:
bigintbigint從 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型數據(所有數字)。存儲大小為 8 個字節。 遂作如下修改
alter proc getSerialNO @TYPE VARCHAR(2), @serialNO VARCHAR(10) OUTPUT AS if (upper(@type) ='TR') begin select @serialNO = SERIALNO from tb_trserialno set @serialNO = cast(cast(@serialNO as bigint) + 1 as varchar) update tb_trserialno set SERIALNO = @serialNO ,LASTUPDATE = CONVERT(VARCHAR,GETDATE(),120) end
測試正常