如何在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");
任何解决方案都将受到高度赞赏
我相信你的想法是正确的。这个问题似乎是一个布尔逻辑问题。您有: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,那么你需要将这两个值相加。