2009-09-08 6 views
0

나는 (현재) 모두 SQL Server 2000 및 SQL Server 2005SQL Server 2000에서 2005 로의 SET IDENTITY_INSERT 동작의 차이점은 무엇입니까?

에서 제공하는 DB를 내가 다른 하나 개의 서버에서 프로그래밍 방식으로 DB를 이동하기 위해 노력하고있어 사용합니다해야하는 응용 프로그램이 있습니다. 내가 사용하는 모든 테이블에는 자동 증가되는 기본 키가 있습니다. 이러한 자동 증가 키는 다른 테이블에서 외래 키로 사용되므로 표를 복사하는 공격 계획은 대상 테이블의 자동 증가를 일시적으로 해제하고 원래의 기본 키를 사용하여 레코드를 그대로 삽입 한 다음 자동으로 전환하는 것입니다. - 증가 다시. 만약 내가 제대로 이해하고

, 나는의 System.Data.SQLClient를 사용하여 VB 2005 년 내 구현은

SET IDENTITY_INSERT tbl_Test ON; 
... 
SET IDENTITY_INSERT tbl_Test OFF; 

을 실행하여 한 번에 하나 개의 테이블 "온/오프 자동 증가를 설정"할 수 있습니다.

간략하게하기 위해 SQL 쿼리 생성과 관련된 코드 줄만 보여 드리겠습니다. 에

Dim insertRegularStatement As String = _ 
     "INSERT INTO tbl_Test (TestData) VALUES (42);" 
    Dim insertRegularCommand As New SqlCommand(insertRegularStatement, connection) 
    insertRegularCommand.ExecuteNonQuery() 

: 기본 키를 지정하지 않고,

Dim turnOffIdentInsertStatement As String = _ 
     "SET IDENTITY_INSERT tbl_Test OFF;" 
    Dim turnOffIdentInsertCommand As New SqlCommand(turnOffIdentInsert, connection) 
    turnOffIdentInsertCommand.ExecuteNonQuery() 

    Dim turnOnIdentInsertStatement As String = _ 
     "SET IDENTITY_INSERT tbl_Test ON;" 
    Dim turnOnIdentInsertCommand As New SqlCommand(turnOnIdentInsert, connection) 
    turnOnIdentInsertCommand.ExecuteNonQuery() 

일반적으로 새로운 레코드를 삽입하려면 :

Dim createTableStatement As String = _ 
     "CREATE TABLE tbl_Test (" & _ 
      "ID_Test INTEGER PRIMARY KEY IDENTITY," & _ 
      "TestData INTEGER" & _ 
      ")" 
    Dim createTableCommand As New SqlCommand(createTableStatement, connection) 

    createTableCommand.ExecuteNonQuery() 

가 또는 해제 IDENTITY_INSERT를 켜려면 :

테이블을 만들려면 명시 적 기본 키를 사용하여 새 레코드 삽입 :

Dim insertWithIDStatement As String = _ 
     "INSERT INTO tbl_Test (ID_Test, TestData) VALUES (20, 42);" 
    Dim insertWithIDCommand As New SqlCommand(insertWithIDStatement, connection) 
    insertWithIDCommand.ExecuteNonQuery() 

내 계획은 IDENTITY_ INSERT를 켜고 명시적인 기본 키가있는 레코드를 추가 한 다음 IDENTITY_ INSERT를 해제하는 코드를 호출하는 것입니다.

이 방법은 내가 SQL Server 2000으로 이야기하고 때 잘 작동하는 것처럼 보이지만 제가 SQL 서버 2005에 대해 동일한 코드를하려고 할 때 예외로 실행 :

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

어떤 힌트를? 언제나처럼 미리 감사드립니다.

답변

2

대량 데이터를 가져올 때 최적화되어 있으므로 SqlBulkCopy을 살펴 보는 것이 좋습니다.

또한 SSIS 작업을 사용하여 데이터를 대량 복사 (대량 복사 API 사용)하거나 연결된 서버를 BULK INSERT 문 (다시 대량 복사 API)으로 사용하는 것이 좋습니다.

동일성 설정은 삽입과 동일한 연결에서 실행되는 set identity_insert 문장입니까? SQL Server 2005는 현재 연결에서 해당 설정 만 유지합니다.다음과 같은

는 SQL 서버 2008 익스프레스 나를 위해 잘 작동 :

그는 그래서이 적용되지 않습니다 쿼리 분석기를 사용하지 않는 것
using (var conn = CreateConnection()) 
{ 
    conn.Open(); 
    new SqlCommand("SET IDENTITY_INSERT Foo ON", conn).ExecuteNonQuery(); 
    new SqlCommand("INSERT INTO Foo(id) VALUES (1)", conn).ExecuteNonQuery(); 
    new SqlCommand("SET IDENTITY_INSERT Foo OFF", conn).ExecuteNonQuery(); 
} 
+0

찾았습니다. 명령 사이에서 연결을 열거 나 닫는 중입니다. 또한 SqlBulkCopy를 가리켜 주셔서 감사합니다! – John

+0

Ahh ... 우연히 암시 적 트랜잭션과 관련이 있습니까? –

+0

David, 가능합니다. 나는 충분히 말할만큼 충분히 익숙하지 않다. – John

1

SET IDENTITY ... ON 문 다음에 GO 문을 삽입해야 할 수 있습니다.

+0

... 다윗 응답 시간을내어 –

+0

감사합니다! – John

1

SQL 쿼리 분석기 세션에서 IDENTITY_INSERT 다음에 실제 삽입 전에 GO를 실행합니다. 아마 이것도 코드에서 호출하는 것에 적용됩니까?

+0

답변 해 주셔서 감사합니다. 매우 감사. – John

관련 문제