복붙노트

[SQL] 어떻게 무시하는 "중복 키"T-SQL의 오류 (SQL 서버)

SQL

어떻게 무시하는 "중복 키"T-SQL의 오류 (SQL 서버)

여러 개의 SQL 문 (INSERT, UPDATE 및 / 또는 DELETES)를 포함하는 트랜잭션을 가지고있다. 실행할 때, 나는 중복 오류 문을 무시하고 다음 명령문에 계속합니다. 그 일을하는 가장 좋은 방법은 무엇입니까?

해결법

  1. ==============================

    1.중복 삽입을 시도하지 않도록 당신에게 나의 강조 조언 당신의 SQL을 구성하는 것이지만, 나는 문에 오류가 롤백의 원인 필요하지 않습니다 언급 할 (필립 켈리의 조각은 당신이 필요 아마도).

    중복 삽입을 시도하지 않도록 당신에게 나의 강조 조언 당신의 SQL을 구성하는 것이지만, 나는 문에 오류가 롤백의 원인 필요하지 않습니다 언급 할 (필립 켈리의 조각은 당신이 필요 아마도).

    XACT_ABORT가 ON하지 않는 한, 트랜잭션 오류는 연결을 죽일 심한 정도가 아니라면 발생하지 않습니다 자동으로 롤백합니다. OFF로 XACT_ABORT 기본 설정됩니다.

    예를 들어, 다음과 같은 SQL 성공적으로 테이블에 세 개의 값을 삽입합니다 :

    create table x ( y int not null primary key )
    
    begin transaction
    insert into x(y)
    values(1)
    insert into x(y)
    values(2)
    insert into x(y)
    values(2)
    insert into x(y)
    values(3)
    commit
    

    당신이 XACT_ABORT를 설정하지 않는 한, 오류가 클라이언트와 롤백의 원인에 제기되고있다. 어떤 무서운 이유는 중복을 삽입 피할 수없는 경우 클라이언트에 오류 트랩 할 수 있어야하고, 그것을 무시해야한다.

  2. ==============================

    2.난 당신이 색인에 IGNORE_DUP_KEY 옵션을 찾고 있습니다 생각합니다. http://msdn.microsoft.com/en-us/library/ms186869.aspx 대신 오류의 경고를 생산하는 중복 삽입 시도가 발생하는 문서화 된 IGNORE_DUP_KEY ON 옵션에서보세요.

    난 당신이 색인에 IGNORE_DUP_KEY 옵션을 찾고 있습니다 생각합니다. http://msdn.microsoft.com/en-us/library/ms186869.aspx 대신 오류의 경고를 생산하는 중복 삽입 시도가 발생하는 문서화 된 IGNORE_DUP_KEY ON 옵션에서보세요.

  3. ==============================

    3.SquareCog의 대답에 귀하의 코멘트에 확장, 당신은 할 수 있습니다 :

    SquareCog의 대답에 귀하의 코멘트에 확장, 당신은 할 수 있습니다 :

    INSERT INTO X VALUES(Y,Z)    WHERE Y  NOT IN (SELECT Y FROM X)
    INSERT INTO X2 VALUES(Y2,Z2) WHERE Y2 NOT IN (SELECT Y FROM X2)
    INSERT INTO X3 VALUES(Y3,Z3) WHERE Y3 NOT IN (SELECT Y FROM X3)
    

    자, 내가 열 Y 모두 세 개의 테이블에 존재하는 것으로 가정합니다. 테이블이 Y.에 인덱싱되지 않은 경우 성능이 저하 될 것이라는 점을주의

    그들이 색인하고 있으므로,이 최적으로 수행해야합니다 - 오, 그래, Y는 그것에 고유 제한 조건이 있습니다.

  4. ==============================

    4.하여 현재 문을 중단, "중복 오류 문을 무시"하고 트랜잭션을 중단하지 않고 다음 문을 계속한다면 단지 .. 각 문 주위의 END TRY를 TRY을 BEGIN 넣어 :

    하여 현재 문을 중단, "중복 오류 문을 무시"하고 트랜잭션을 중단하지 않고 다음 문을 계속한다면 단지 .. 각 문 주위의 END TRY를 TRY을 BEGIN 넣어 :

    BEGIN TRY
        INSERT ...
    END TRY
    BEGIN CATCH /*required, but you dont have to do anything */ END CATCH
    ...
    
  5. ==============================

    5.나는 다음과 차임 싶습니다

    나는 다음과 차임 싶습니다

    데이터의 99 %가 "바보"삽입에 비해 (20 개 라인 / 초에 같은, 내 경우에는, 200 선에서 / 초) 엄청난 성능 저하의 선택 사전에 결과를하고 오류없이 삽입 가서 가끔를 잡는 경우 오류.

    오류 일들은 "PRIMARY KEY 제약 조건 위반"을 무시하고 후 (헤드 룸은 "무엇 병목 자원이 없습니다"로 정의되는) 다른 자원이 병목되고 다시 갔다.

    어떤 내가 처음에이 토론에 착륙 온 이유입니다.

  6. ==============================

    6.확인. 일부 오류 처리를 시도 후, 나는 내가 가지고 있던 문제를 해결하는 방법을 알아 냈어.

    확인. 일부 오류 처리를 시도 후, 나는 내가 가지고 있던 문제를 해결하는 방법을 알아 냈어.

    다음은이 작업을하는 방법의 예입니다 (저는 누락 된 무언가가 있다면 알려주세요) :

    SET XACT_ABORT OFF ; -- > really important to set that to OFF
    BEGIN
    DECLARE @Any_error int
    DECLARE @SSQL varchar(4000)
    BEGIN TRANSACTION
        INSERT INTO Table1(Value1) VALUES('Value1')
        SELECT @Any_error = @@ERROR
        IF @Any_error<> 0 AND @Any_error<>2627 GOTO ErrorHandler
    
        INSERT INTO Table1(Value1) VALUES('Value1')
        SELECT @Any_error = @@ERROR
        IF @Any_error<> 0 AND @Any_error<>2627 GOTO ErrorHandler
    
        INSERT INTO Table1(Value1) VALUES('Value2')
        SELECT @Any_error = @@ERROR
        IF @Any_error<> 0 AND @Any_error<>2627 GOTO ErrorHandler
    
        ErrorHandler: 
           IF @Any_error = 0 OR @Any_error=2627
           BEGIN 
               PRINT @ssql 
               COMMIT TRAN
           END
           ELSE 
           BEGIN 
               PRINT @ssql 
               ROLLBACK TRAN 
           END
    END
    

    위의 거래의 결과로, 표 값은 다음 값 1, 값이있을 것이다.

    2627 그런데 중복 키에 대한 오류 코드입니다.

    프롬프트 응답 및 유용한 제안에 대한 여러분 모두 감사합니다.

  7. ==============================

    7.

    INSERT INTO KeyedTable(KeyField, Otherfield)
    SELECT n.* FROM 
        (SELECT 'PossibleDupeLiteral' AS KeyField, 'OtherfieldValue' AS Otherfield
         UNION ALL
         SELECT 'PossibleDupeLiteral', 'OtherfieldValue2'
        )
    LEFT JOIN KeyedTable k
        ON k.KeyField=n.KeyField
    WHERE k.KeyField IS NULL
    

    이 같은 데이터 그것을 발견하면 아무것도 삽입 (이 중복 키를 확인하지 희망 같은 빠른 방법)를 찾기 위해 서버를 알려줍니다.

    나는 서버가 자동으로 자신의 속는 키 오류를 무시하면 IGNORE_DUP_KEY 솔루션 너무하지만, 캐치 문제에 대한 오류에 의존하는 다음 사람이 신비화 될 것 같은.

    나는 필립 켈리의 솔루션을 통해이를 선택하는 이유는 데이터의 여러 행을 제공 할 수 있습니다 만 누락 된 사람이 실제로 얻을 점이다 :

  8. ==============================

    8.내가 같은 일을하려고했기 때문에 내가 여기 온; 나는 소스 데이터에 속는했다 만 대상 데이터를 업데이트하고 속는을 추가 할 싶어 알고 있었다.

    내가 같은 일을하려고했기 때문에 내가 여기 온; 나는 소스 데이터에 속는했다 만 대상 데이터를 업데이트하고 속는을 추가 할 싶어 알고 있었다.

    나는 당신이 업데이트하거나 누락 다른 및 INSERT 것들 DELETE 일 수 있기 때문에 병합 여기에 잘 작동합니다 생각합니다.

    나는이 일을 끝내었고, 그것은 큰 일했습니다. 나는 Excel 파일을 통해 루프 SSIS를 사용하고 속는 모든과 함께 "RAW"SQL 테이블에로드. 그럼 난 생산 테이블과 "원시"테이블을 병합 병합을 실행합니다. 그럼 다음 Excel 파일에 "원시"테이블과 이동 TRUNCATE.

  9. ==============================

    9.SQL 서버 2000 :

    SQL 서버 2000 :

         INSERT INTO t1 (ID, NAME)
          SELECT valueid, valuename
          WHERE  NOT EXISTS
                   (SELECT 0
                    FROM   t1 as t2
                    WHERE  t2.ID = valueid AND t2.name = valuename)
    
  10. ==============================

    10.기본 키 정의 동안 사용 IGNORE_DUP_KEY = OFF를 삽입하는 동안 중복을 무시합니다. 예를 들면

    기본 키 정의 동안 사용 IGNORE_DUP_KEY = OFF를 삽입하는 동안 중복을 무시합니다. 예를 들면

    create table X( col1.....)
    
    CONSTRAINT [pk_X] PRIMARY KEY CLUSTERED 
    (
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 70) ON [PRIMARY]
    ) ON [PRIMARY]
    
  11. ==============================

    11.그럼 당신은 임시 테이블과이 문제를 해결할 수 ..

    그럼 당신은 임시 테이블과이 문제를 해결할 수 ..

    DECLARE @RoleToAdds TABLE
    ([RoleID] int, [PageID] int)
    
    INSERT INTO @RoleToAdds ([RoleID], [PageID])
        VALUES
        (1, 2),
        (1, 3),
        (1, 4),
        (2, 5)
    
    INSERT INTO [dbo].[RolePages] ([RoleID], [PageID])
        SELECT rta.[RoleID], rta.[PageID] FROM @RoleToAdds rta WHERE NOT EXISTS 
            (SELECT * FROM [RolePages] rp WHERE rp.PageID = rta.PageID AND rp.RoleID = rta.RoleID)
    

    이 데이터의 큰 양을 위해 작동하지 않을 수도 있지만 몇 행을 위해 작동합니다!

  12. ==============================

    12.키는 고유해야합니다. 그렇게하지 마십시오. 필요에 따라 재 설계.

    키는 고유해야합니다. 그렇게하지 마십시오. 필요에 따라 재 설계.

    (당신이 다음 삭제를 삽입하려고하는, 그리고 삽입이 실패 할 경우 ... 단지 중 문에서 오류에 삭제 첫째. 롤백을).

  13. from https://stackoverflow.com/questions/1139050/how-to-ignore-duplicate-key-error-in-t-sql-sql-server by cc-by-sa and MIT license