一开始的时候用如下代码:
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
测试正常