0

ある SQL Server データベースから別の SQL Server データベースにデータをコピーする必要があります。

宛先 SQL Server DB には存在するがソース データベースには存在しない Identity やその他のデータ型などの列があります。ソース テーブルには term 列しかありませんが、宛先テーブルには id (ID) と term 列があります。

コピー中に次のようなエラーが発生します。

IDENTITY_INSERT が ON に設定されている場合、またはレプリケーション ユーザーが NOT FOR REPLICATION ID 列に挿入している場合は、テーブル 'Terms' の 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();
}
4

1 に答える 1

1

オンにする場合IDENTITY_INSERTは、ID 列の値を指定する必要があります。ソース テーブルには ID 列にコピーできる列がないと言っています。これを機能させるには、SET IDENTITY_INSERTステートメントを削除して、実際にある列のみをコピーします。

NULL 可能でない追加の列がある場合は、それらの値をハードコーディングする必要がある場合があります。

于 2013-02-17T20:47:27.960 に答える