2013-02-17 3 views
0

하나의 SQL Server 데이터베이스에서 다른 SQL Server 데이터베이스로 데이터를 복사해야합니다.원본 SQL 데이터베이스에서 대상 SQL 데이터베이스로 복사

대상 SQL Server DB에는 있지만 소스 데이터베이스에는없는 Identity 및 다른 데이터 형식 같은 열이 있습니다. 원본 테이블에는 용어 열만 있지만 대상 테이블에는 ID (ID)와 용어 열이 있습니다. 내가 같은 오류가 발생하고 복사하는 동안

:

명시 값이 '약관'중 하나 IDENTITY_INSERT가 설정되어있을 때 ON 또는 복제 사용자가 NOT REPLICATION FOR에 삽입 할 때 테이블의 ID 열을 지정해야합니다 식별 열.

string colNames = ""; 
foreach (DataColumn col in ds.Tables[0].Columns) 
{ 
    colNames += col.ColumnName + ","; 
} 
colNames = colNames.Remove(colNames.Length - 1, 1); 
sqlCmd2.Parameters.Clear(); 

bool hasIdentityCol = false; 
sqlCmd2.CommandType = CommandType.Text; 


sqlCmd2.CommandText = "SELECT OBJECTPROPERTY(object_id('" + row["Table_Name"] + "'), 'TableHasIdentity')"; 
if (sqlCmd2.ExecuteScalar() != DBNull.Value && Convert.ToInt32(sqlCmd2.ExecuteScalar()) > 0) 
{ 
    hasIdentityCol = true; 
} 


if (hasIdentityCol == true) 
{ 
    sqlCmd2.CommandText = "SET IDENTITY_INSERT dbo." + row["Table_Name"] + " ON"; 
    sqlCmd2.Transaction = sqlTran; 
    sqlCmd2.ExecuteNonQuery(); 
} 

sqlCmd2.CommandText = "INSERT INTO " + txtDestinationDatabase.Text + ".dbo." + row["Table_Name"] + "(" + colNames + ") SELECT " + colNames + " FROM " + txtSourceDatabase.Text + ".dbo." + row["Table_Name"]; 
sqlCmd2.Transaction = sqlTran; 
sqlCmd2.ExecuteNonQuery(); 
if (hasIdentityCol == true) 
{ 
    sqlCmd2.CommandText = "SET IDENTITY_INSERT " + txtDestinationDatabase.Text + ".dbo." + row["Table_Name"] + " OFF"; 
    sqlCmd2.Transaction = sqlTran; 
    sqlCmd2.ExecuteNonQuery(); 
} 
+0

MS Access와 관련이 있습니까? 또한 원본 테이블과 대상 테이블의 정의는 무엇입니까? 소스에 ID가 없다고 언급 했으므로 대상 열에 어떤 열을 삽입하려고합니까? 이 열이 포함되어서는 안되며 자체적으로 채워질 수 있습니다. –

+0

실제 작업은 MS Access 데이터를 SQL Server로 복사하는 것입니다. SQL 데이터베이스 스키마가 변경되었습니다. MS Access의 테이블에는 필드 용어 만 있고 SQL DB에는 ID (Identity), 용어 필드가 있습니다. –

답변

1

당신이 식별 컬럼에 대한 값을 지정해야합니다 당신이 IDENTITY_INSERT을 turne합니다. 원본 테이블에 ID 열에 복사 할 수있는 열이 없다고 말합니다. 이 작업을 수행하려면 SET IDENTITY_INSERT 문을 제거하고 실제로 가지고있는 열만 복사하십시오.

Null을 사용할 수없는 추가 열이있는 경우 값을 하드 코딩해야 할 수 있습니다.

+0

데이터를 복사 할 약 200 개의 테이블이 있습니다. 모든 것을 하드 코딩하는 것은 어려울 것입니다. –

+0

자동화 된 프로세스는 사용자가 지정하지 않고 원하는 열의 값을 알아 내야합니다. 나는 SQL Server가 아직 마음 읽기가 불가능하다고 생각하기 때문에 여기서 글 머리 기호를 물고 하드 코딩 체계를 설정해야 할 것입니다. 그러나 이것은 테이블 구동이 될 수 있습니다 - 그런 식으로 생각하면 꽤 어렵지는 않습니다. --- 하드 코딩은 소스의 일부가 아닌 목표 테이블에 널 (NULL) 입력이 불가능한 컬럼이있는 경우에만 필요합니다. 모든 컬럼이 널 (NULL) 입력 가능하면 앞에서 언급 한'SET IDENTITY_INSERT' 코드를 제거하십시오. –

관련 문제