簡體   English   中英

如何在SQL批量復制到另一個表期間維護標識列值?

[英]How to maintain identity column value during SQL bulk copy to another table?

我正在使用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 = 00000001

布爾“&”運算符將兩個值放在一起(意味着保留二進制中常見的位)。 該操作的值導致零。 你真正想要的是一個OR:8 | 1 = 9

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

與英語措辭相比,布爾運算符有點落后:如果你想要KeepNulls並且想要KeepIdentity,那么你需要將這兩個值組合在一起。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM