2011-10-06 39 views

回答

4

,当你超过最大int值你会得到一个算术溢出错误。

试试:

DECLARE @t TABLE (
    id INT IDENTITY (2147483647,1), 
    name VARCHAR(100) 
) 


INSERT INTO @t (name) VALUES ('Joe') 
INSERT INTO @t (name) VALUES ('Tim') 
+0

如果你在INSERT之前使用SET ARITHABORT OFF? :-)嗯......一样。 – xanatos

1

它不会让你插入更多行。

1

的东西我不知道的是身份的功能(@@identitySCOPE_IDENTITYIDENT_CURRENT)返回一个十进制(38,0)值,无论什么你的本地身份字段定义如。

正如其他人所指出的,该错误信息是一样的性质 Arithmetic overflow error converting IDENTITY to data type X

而当你问到SQL Server中的问题,我的MySQL 4.trash的恐怖故事是一个老工作的遗留应用程序有在tinyint上定义的标识。当溢出,它不弹了出来,只是不停地将具有相同id行(我才知道,PK应该阻止它,但它是一个真正不良设计DB)

@Joe Stefanelli已经提供了为了我自己的教育而产生错误的框架,我将它吹掉以涵盖bigint和decimal。

SET NOCOUNT ON 

IF EXISTS (select 1 from sys.tables T WHERE T.name = 'Tim' AND SCHEMA_NAME(t.schema_id) = 'dbo') 
BEGIN 
    DROP TABLE dbo.Tim 
END 

IF EXISTS (select 1 from sys.tables T WHERE T.name = 'Tim_decimal' AND SCHEMA_NAME(t.schema_id) = 'dbo') 
BEGIN 
    DROP TABLE dbo.Tim_decimal 
END 

IF EXISTS (select 1 from sys.tables T WHERE T.name = 'Tim_bigint' AND SCHEMA_NAME(t.schema_id) = 'dbo') 
BEGIN 
    DROP TABLE dbo.Tim_bigint 
END  
-- http://msdn.microsoft.com/en-us/library/ms187342.aspx 

CREATE TABLE 
    dbo.Tim 
(
    tim_id int identity(2147483646 , 1) NOT NULL PRIMARY KEY 
, val int 
) 

BEGIN TRY 
    -- consumes the first value 
    INSERT INTO 
     dbo.Tim 
    SELECT 
     0 AS number 

    SELECT SCOPE_IDENTITY() AS last_int_identity 

    -- this insert brings us to the edge 

    INSERT INTO 
     dbo.Tim 
    SELECT 
     1 AS number 

    SELECT SCOPE_IDENTITY() AS last_int_identity 

    -- This one goes kaboom 
    --Msg 8115, Level 16, State 1, Line 27 
    --Arithmetic overflow error converting IDENTITY to data type int. 
    INSERT INTO 
     dbo.Tim 
    SELECT 
     -1 AS number 
END TRY 
BEGIN CATCH 
    SELECT 
     ERROR_NUMBER() AS ErrorNumber 
    , ERROR_SEVERITY() AS ErrorSeverity 
    , ERROR_STATE() AS ErrorState 
    , ERROR_PROCEDURE() AS ErrorProcedure 
    , ERROR_LINE() AS ErrorLine 
    , ERROR_MESSAGE() AS ErrorMessage 
END CATCH 

BIGINT版本

---------------------------------------------- 
-- Try again with big ints 
---------------------------------------------- 
SET NOCOUNT ON 

CREATE TABLE 
    dbo.Tim_bigint 
(
    tim_id bigint identity(9223372036854775806, 1) NOT NULL PRIMARY KEY 
, val int 
) 

BEGIN TRY 
    -- consumes the first value 
    INSERT INTO 
     dbo.Tim_bigint 
    SELECT 
     0 AS number 

    SELECT SCOPE_IDENTITY() AS last_bigint_identity 

    -- this insert brings us to the edge 

    INSERT INTO 
     dbo.Tim_bigint 
    SELECT 
     1 AS number 

    SELECT SCOPE_IDENTITY() AS last_bigint_identity 

    -- This one goes kaboom 
    --Msg 8115, Level 16, State 1, Line 27 
    --Arithmetic overflow error converting IDENTITY to data type bigint. 
    INSERT INTO 
     dbo.Tim_bigint 
    SELECT 
     -1 AS number 
END TRY 
BEGIN CATCH 
    SELECT 
     ERROR_NUMBER() AS ErrorNumber 
    , ERROR_SEVERITY() AS ErrorSeverity 
    , ERROR_STATE() AS ErrorState 
    , ERROR_PROCEDURE() AS ErrorProcedure 
    , ERROR_LINE() AS ErrorLine 
    , ERROR_MESSAGE() AS ErrorMessage 
END CATCH 

十进制版本

---------------------------------------------- 
-- Let's really max this out 
---------------------------------------------- 
SET NOCOUNT ON 

CREATE TABLE 
    dbo.Tim_decimal 
(
    -- 10^38 -1 
    -- 10^37 = 10000000000000000000000000000000000000 
    -- 10^38 = 100000000000000000000000000000000000000 
    tim_id decimal(38,0) identity(99999999999999999999999999999999999998, 1) NOT NULL PRIMARY KEY 
, val int 
) 

BEGIN TRY 
    -- consumes the first value 
    INSERT INTO 
     dbo.Tim_decimal 
    SELECT 
     0 AS number 

    SELECT SCOPE_IDENTITY() AS last_decimal_identity 


    -- this insert brings us to the edge 

    INSERT INTO 
     dbo.Tim_decimal 
    SELECT 
     1 AS number 

    SELECT SCOPE_IDENTITY() AS last_decimal_identity 

    -- This one goes kaboom 
    --Msg 8115, Level 16, State 1, Line 27 
    --Arithmetic overflow error converting IDENTITY to data type decimal. 
    INSERT INTO 
     dbo.Tim_decimal 
    SELECT 
     -1 AS number 
END TRY 
BEGIN CATCH 
    SELECT 
     ERROR_NUMBER() AS ErrorNumber 
    , ERROR_SEVERITY() AS ErrorSeverity 
    , ERROR_STATE() AS ErrorState 
    , ERROR_PROCEDURE() AS ErrorProcedure 
    , ERROR_LINE() AS ErrorLine 
    , ERROR_MESSAGE() AS ErrorMessage 
END CATCH 
相关问题