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

本文关键字:维护 标识 另一个 SQL 大容量 复制 | 更新日期: 2023-09-27 18:28:46

我正在使用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");

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

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

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

SqlBulkCopyOptions.KeepNulls=8=00001000

SqlBulkCopyOptions.KeepIdentity=1=0000000 1

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

新的SqlBulkCopy(ConfigurationManager.ConnectionStrings["ConnectionDatabase2"].ConnectionString,SqlBulkCopyOptions.KeepNulls|SqlBulkCopOptions.Keep Identity)

与英语相比,布尔运算符有点落后:如果你想保持Nulls AND,你想保持Identity,那么你需要将这两个值相加。