2011-10-06 3 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

그리고 당신은 삽입하기 전에 SET의 ARITHABORT를 OFF 사용하는 경우? :-) 음 ... 같은. – xanatos

1

그것은 당신이 더 많은 행을 삽입 할 수 없습니다에 대한

감사합니다.

1

뭔가 내가 신원 기능 (@@identity, SCOPE_IDENTITYIDENT_CURRENT)에 관계없이 해당 지역의 정체성 필드가 정의 무엇 (38,0) 값을 소수점을 반환했습니다 인식하지 않았다 같이. 다른 사람들이 지적했듯이

오류 메시지가 같은 성격 Arithmetic overflow error converting IDENTITY to data type X

될 것입니다 그리고 당신은 SQL Server에 대한 질문을하면서, MySQL의 4.trash의 내 공포 이야기는 옛 직장에서 레거시 응용 프로그램입니다했다 tinyint에 정의 된 ID. 즉 범람 할 때, 그냥 같은 ID를 가진 행을 삽입 유지, 밖으로 폭격하지 않았다 (내가 아는을의 PK가 그것을 방지해야하지만이었다 정말이 제대로 디자인 DB)

@Joe Stefanelli 이미 제공 오류를 생성하기위한 프레임 워크지만, 내 자신의 교육을 위해, 나는 bigints 및 십진수를 커버하기 위해 그것을 날려 버렸다.

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 
관련 문제