SQL Server 2008을 사용하여 IDENTITY_INSERT를 설정 및 해제하는 방법은 무엇입니까?


461

IDENTITY_INSERTOFF로 설정 하면 삽입 작업 중에 오류가 발생하는 이유는 무엇 입니까?

SQL Server 2008에서 올바르게 설정하려면 어떻게합니까? SQL Server Management Studio를 사용합니까?

이 쿼리를 실행했습니다.

SET IDENTITY_INSERT Database. dbo. Baskets ON

그런 다음 콘솔에 명령이 성공적으로 완료되었다는 메시지가 나타납니다. 그러나 응용 프로그램을 실행할 때 여전히 아래에 표시된 오류가 발생합니다.

Cannot insert explicit value for identity column in table 'Baskets' when 
IDENTITY_INSERT is set to OFF.

수행하려는 작업을 이해할 수 있도록이 질문을 확장하십시오. 이 오류가 발생하면 어떤 설명을 실행하고 있으며 오류 메시지의 실제 텍스트는 무엇입니까?
매트 깁슨

다른 질문을했지만 여기에 답변을 수락해야합니다 . 요청한 내용에 답변 했습니다 .
gbn

8
누군가가 응용 프로그램에서 ID 값을 보내려고한다는 생각에 공포가 있습니다. 드문 데이터 마이그레이션을 제외하고는 수행해야 할 작업이 아닙니다. 응용 프로그램에서이를 실행할 수있을만큼 정기적으로이 작업을 수행하는 경우 테이블 디자인을 다시 방문해야합니다.
HLGEM

SQL 스크립트 백업에서 이것을 사용하고 있습니다. 복원하는 동안 원래 값으로 자동 증분 테이블에 데이터를로드 할 수 있습니다. 스크립트 백업을 통해 SQL 데이터베이스를 다운 그레이드 할 수 있습니다. 텍스트 필드에 이진 데이터를 저장하면 Management Studio의 스크립트 백업을 실현하여 언로드 할 수있는 스크립트를 만듭니다.
Jettero

답변:


771

MSDN에 따라 SQL을 통해

SET IDENTITY_INSERT sometableWithIdentity ON

INSERT INTO sometableWithIdentity 
    (IdentityColumn, col2, col3, ...)
VALUES 
    (AnIdentityValue, col2value, col3value, ...)

SET IDENTITY_INSERT sometableWithIdentity OFF

완전한 오류 메시지는 정확히 무엇이 잘못되었는지 알려줍니다 ...

IDENTITY_INSERT가 OFF로 설정되어 있으면 'sometableWithIdentity'테이블에서 ID 열에 명시 적 값을 삽입 할 수 없습니다.


@Beginner : 그래도 오류가 있습니다. 값을 삽입하고 싶지 않다는 것을 어떻게 알 수 있습니까? 오류 메시지 만 있습니다
gbn

3
DB.SaveChanges ()를 할 때 내 앱에서 오류가 발생했습니다.
초보자

5
아니요, ID 열에 대한 값 전송을 중지하십시오. 또는 값을 보내려면 앱에서 원하는 경우 설정하십시오 ....하지만 왜 ID 속성이있는 열이 값을 생성하도록 설정되어 있습니까? 우리는 당신을 결정할 수 없습니다
gbn

22
@Beginner : 설정은 현재 세션에서만 적용 가능하므로 (이 질문에 대해서는 아무도 지적하지 않았습니다.) 응용 프로그램에서 이러한 삽입을 수행하려면 응용 프로그램을 켜야합니다 (그리고 아마도 즉시 설정하는 것이 가장 좋습니다) gbn show와 같은 인서트가 끝나면 다시 꺼집니다). Ismael이 제안한 것처럼 명시 적 삽입 열이 지정되지 않은 (?) 경우 이전 버전의 SQL Server는 암시 적으로 모든 열에 값을 포함했을 것입니다.
Rob Parker

2
@Rob, 나는 당신이 열을 지정하지 않고 삽입하지 않는 코드에서 개인적으로 코드 검토에 실패한다고 지적했다. 오류로 인한 시간 외에도이 방법은 위험한 방법이며 열 데이터가 올바르게 일치하지 않으면 심각한 데이터 무결성 문제가 발생할 수 있습니다.
HLGEM

59

IDENTITY_INSERT를 ON으로 설정 한 후에도 삽입 할 수없는 문제가있었습니다.

문제는 열 이름을 지정하지 않았고 어떤 이유로 든 좋아하지 않았다는 것입니다.

INSERT INTO tbl Values(vals)

따라서 기본적으로 전체 삽입을 수행하십시오. tbl (cols) Values ​​(vals)


6
답변 창에 질문하지 마십시오.
Duk

4
열 목록 (테이블의 열 둘 다, blah)을 지정하기 위해 이것이 바로 내가 원하는 것입니다
Maslow

36

가져 오기 :INSERT 명령문에 열을 작성 해야합니다 .

INSERT INTO TABLE
SELECT * FROM    

정확하지 않습니다.

Insert into Table(Field1,...)
Select (Field1,...) from TABLE

맞다


2
감사합니다. 매우 도움이되었습니다
José Romero

1
두 테이블에 동일한 열이있는 경우 다음과 같이 select (Field1 ..)에 열을 나열하지 않고 수행 할 수 있습니다 .... 테이블에 삽입하십시오 (Field1, ...) Select * from TABLE ... 먼저 삽입 할 ID 필드 ** SET IDENTITY_INSERT Table_name ON
user3590235

@ user3590235 열 목록이 동일하다는 것은 위험한 가정입니다. 수동 사용자 쿼리 이외의 다른 사람은 참조를 업데이트하지 않고 다른 사람이 테이블 정의를 수정하면 언젠가 PROD가 중단 될 것이라고 보장하므로 절대 그렇게하지 마십시오.
Elaskanator

5

나는 이것이 오래된 실이라는 것을 알고 있지만 나는 이것에 부딪쳤다. 사용자가 다른 세션 Set IDENTITY_INSERT ON 후에 Identity 열에서 삽입을 실행하려고하면 위의 오류가 발생합니다.

Identity Insert 값 설정 및 후속 Insert DML 명령은 동일한 세션에서 실행됩니다.

여기서 @Beginner는 Identity Insert를 별도로 설정 한 다음 응용 프로그램에서 삽입을 실행했습니다. 그래서 그는 아래 오류가 발생합니다 :

Cannot insert explicit value for identity column in table 'Baskets' when 
IDENTITY_INSERT is set to OFF.

0

이것은 PRIMARY KEY 필드가 있고 중복되는 값을 삽입하거나 INSERT_IDENTITY 플래그가 on으로 설정된 경우에 가능합니다.


0

그것은을 넣어 필요 보이는 SET IDENTITY_INSERT Database.dbo.Baskets ON;모든 SQL 전에 INSERT전송 배치.

INSERT ... VALUES ...처음에 하나의 SET IDENTITY_INSERT ... ON;문자열로 시작하는 여러 명령을 보낼 수 있습니다 . 배치 구분 기호를 사이에 두지 마십시오.

SET IDENTITY_INSERT ... ON전송 블록 (예 : .ExecuteNonQuery()C #에서) 이후에 중지가 작동하는 이유를 모르겠습니다 . SET IDENTITY_INSERT ... ON;다음 SQL 명령 문자열의 시작 부분에 다시 넣어야 했습니다.


아마 이것은 당신의 질문에 대답합니다 : stackoverflow.com/questions/5791941/…
Demetris Leptos

-1

ID 삽입을 설정 한 후 'go'명령을 추가해야합니다. 예:

SET IDENTITY_INSERT sometableWithIdentity ON
go

INSERT sometableWithIdentity (IdentityColumn, col2, col3, ...)
VALUES (AnIdentityValue, col2value, col3value, ...)

SET IDENTITY_INSERT sometableWithIdentity OFF
go

5
이 질문은 4 살이며 허용되는 답변이 있습니다. 귀하의 답변은 허용 된 답변을 복제합니다
Ghost

13
글쎄요, 정확한 복제는 아닙니다-그는 "go"명령을 포함
시켰습니다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.