从源sql数据库复制到目标sql数据库

问题描述:

我必须将数据从一个SQL Server数据库复制到其他SQL Server数据库。从源sql数据库复制到目标sql数据库

存在目标SQL Server数据库中但不存在于源数据库中的列(如Identity和其他数据类型)。源表只有术语列,但目标表具有标识(标识)和术语列。

在副本我收到错误,如:

必须为表“条款”既可以当IDENTITY_INSERT设置为ON时或当复制用户插入到NOT FOR REPLICATION标识列指定

明确的值身份列。

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有什么关系?另外,源表和目标表的定义是什么?你提到在源文件中没有标识,那么你想要插入目标标识列的列是什么?有可能这个列不应该被包含并留下来填充它自己。 – 2013-02-17 18:38:34

+0

实际的任务是将MS Access数据复制到sql server。 SQL数据库模式已更改.MS Access中的表仅具有字段条款,而sql数据库具有ID(标识),Term字段。 – 2013-02-17 21:41:46

如果turne IDENTITY_INSERT你必须为标识列指定值。你说你的源表没有可以复制到标识列的列。要做到这一点,只需删除SET IDENTITY_INSERT语句,并只复制实际拥有的列。

如果有其他列不可为空,则可能必须对这些值进行硬编码。

+0

我有大约200张表来复制他们的数据。硬编码每一件东西都很困难。 – 2013-02-17 21:24:53

+0

自动化过程如何在不指定它们的情况下找出列中想要的值?我不认为SQL Server能够读取数据,所以你必须在这里硬着头皮来设置某种硬编码方案。然而,这可能是桌面驱动的 - 这种方式并不令人望而生畏。 ---只有在目标表中不包含非空字段的情况下才需要硬编码。如果您的所有列都可以为空,只需删除前面提到的“SET IDENTITY_INSERT”代码即可。 – 2013-02-18 02:32:50