如何在SQL批量复制到另一个表期间维护标识列值?

时间:2014-11-01 10:10:19

标签: c# sql asp.net sql-server

我正在使用SqlBulkCopy将数据从一个表复制到另一个表。有很多表可以做到这一点。

我正在使用for循环为每个表复制数据。

但是,我遇到了一个问题,每当我将数据从源表复制到目标表时,身份列值就会发生变化。

假设在源表的标识列中有这样的值

301
305
605

但是当我复制数据时,它将导入目标表中,就像那样

1
2
3

我试过了:

    set identity_insert [tablename] ON

    //COPY Data from source to destination
    set identity_insert [tablename] OFF

我还设置SqlBulkCopyOption.KeepIdentity     我的c#代码

          //  Dataservice.KeepIdentity2("SET IDENTITY_INSERT "+tableName+" ON");

            using (SqlBulkCopy bulkCopy =
                 new SqlBulkCopy(ConfigurationManager.ConnectionStrings["ConnectionDatabase2"].ConnectionString, SqlBulkCopyOptions.KeepNulls & SqlBulkCopyOptions.KeepIdentity))
            {
                bulkCopy.SqlRowsCopied +=
                    new SqlRowsCopiedEventHandler(OnSqlRowsTransfer);
                bulkCopy.BatchSize = 5000;
                bulkCopy.DestinationTableName = tableName;
                bulkCopy.WriteToServer(DestinationDatatable);
            }
            //Set Identity insert OFF
          //  Dataservice.KeepIdentity2("SET IDENTITY_INSERT " + tableName + " OFF");

任何解决方案都将受到高度赞赏

1 个答案:

答案 0 :(得分:3)

我相信你有正确的想法。问题似乎是一个布尔逻辑问题。 你有:SqlBulkCopyOptions.KeepNulls& SqlBulkCopyOptions.KeepIdentity 这两个项的值是:

SqlBulkCopyOptions.KeepNulls = 8 = 00001000

SqlBulkCopyOptions.KeepIdentity = 1 = 00000001

布尔"&"运算符将两个值放在一起(意味着保留二进制中常见的位)。该操作的值导致零。 你真正想要的是一个OR:8 | 1 = 9

new SqlBulkCopy(ConfigurationManager.ConnectionStrings [" ConnectionDatabase2"] .ConnectionString,SqlBulkCopyOptions.KeepNulls | SqlBulkCopyOptions.KeepIdentity))

与英语措辞相比,布尔运算符有点落后:如果你想要KeepNulls并想要KeepIdentity,那么你需要将这两个值组合在一起。