【问题标题】:Copy from source sql database to destination sql database从源 sql 数据库复制到目标 sql 数据库
【发布时间】:2013-02-17 18:05:07
【问题描述】:

我必须将数据从一个 SQL Server 数据库复制到另一个 SQL Server 数据库。

在目标 SQL Server DB 中存在诸如 Identity 和其他数据类型之类的列,但在源数据库中不存在。源表只有 term 列,但目标表有 id(身份)和 term 列。

在复制过程中出现如下错误:

当 IDENTITY_INSERT 设置为 ON 或复制用户插入 NOT FOR REPLICATION 标识列时,必须为表 'Terms' 中的标识列指定显式值。

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();
}

【问题讨论】:

  • 这和 MS Access 有关系吗?另外,源表和目标表的定义是什么?您提到源中没有标识,那么您要在目标标识列中插入哪一列?可能不应该包含此列并留给自己填充。
  • 实际任务是将MS Access数据复制到sql server。 sql 数据库架构已更改。MS Access 中的表只有字段 term,sql DB 有 ID(Identity),Term 字段。

标签: c# ms-access sql-server-2008-r2 database-schema


【解决方案1】:

如果您打开IDENTITY_INSERT,您必须为标识列指定值。您说您的源表没有可以复制到标识列中的列。要完成这项工作,只需删除 SET IDENTITY_INSERT 语句并仅复制您实际拥有的列。

如果有其他不可为空的列,您可能必须为这些列硬编码值。

【讨论】:

  • 我有大约 200 个表来复制它们的数据。很难对每件事都进行硬编码。
  • 如何在不指定列的情况下自动计算出您想要的列中的值?我认为 SQL Server 还没有读心术的能力,所以你必须在这里硬着头皮设置某种硬编码方案。然而,这可能是表驱动的——这样就不会那么令人生畏了。 --- 仅当目标表中有不属于源的不可空列时才需要硬编码。如果您的所有列都可以为空,只需删除我之前提到的SET IDENTITY_INSERT 代码。
猜你喜欢
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-03
  • 2021-04-10
相关资源
最近更新 更多