2014-10-31 58 views
0

我試圖改變列IDENTITY使用Microsoft.SqlServer.Smo從一個沒有依賴關係的表和所有的數據先前(從另一個數據庫)加載,但我得到一個錯誤像這樣「不允許修改Column對象的標識屬性,您必須刪除並重新創建具有所需屬性的對象」。事情是,我試圖用Management Studio來做到這一點,它沒有問題。你有什麼建議嗎?。由於提前改變列身份與Microsoft.SqlServer.Smo

這是代碼:

foreach (Column source in sourcetable.Columns) 
{ 
    try 
    { 
     if(source.Identity) 
     { 
      Column column = copiedtable.Columns[source.Name]; 

      // column.Computed = source.Computed; 
      // column.ComputedText = source.ComputedText; 

      column.Identity = source.Identity; 
      column.IdentityIncrement = source.IdentityIncrement; 
      column.IdentitySeed = source.IdentitySeed; 

      column.Alter(); 
     } 
    } 
    catch { } 
} 
+1

您無法從現有列添加或刪除'IDENTITY'。由於這在T-SQL中是不可能的,所以也不可能使用SMO ..... – 2014-10-31 05:57:18

回答

1

嘗試在SSMS中再次執行此操作,並選擇將操作編寫爲腳本而不是直接應用它。您會發現它創建了一個臨時表,並將identity屬性設置爲true(並且其他所有內容都相同),將數據從活動表複製到臨時表中,刪除活動表並將臨時表重命名爲現場表。你需要和SMO做類似的事情。

複製表格非常簡單:遍歷列,索引,外鍵等,並以這種方式創建新表(注意在調用Create()之前正確設置標識屬性)。要移動數據,請查看Transfer類。一旦完成,這是一個下降和重命名(或重命名和重命名,如果你想要安全)。

我有點驚訝,SMO不以某種方式在封面下做這件事(因爲SSMS使用SMO下的封面)。如果我找到其他可以自動執行此操作的內容,我會通知您。

+0

有一種[在SQL中執行此操作的方式](http://stackoverflow.com/a/6086661/15498)沒有所有的複製shenanigans,但我不確定是否有一個體面的方法通過SMO複製該技術。 – 2014-10-31 07:37:51

+0

謝謝,實際上SSMS會像你說的那樣刪除並複製一張新表格。我必須爲每個我嘗試導出的表格創建一個類似於SSMS的腳本 – hexehell00 2014-11-03 18:42:31

0

你們是不是要更新現有記錄,或添加一個新的記錄?如果您要添加新記錄,請執行插入操作。如果您正在更新現有記錄,請不要覆蓋標識列值。

要將標識值插入到SQL Server中的表中,必須告訴數據庫允許您執行此操作。語法爲:

Set Identity_Insert [table] ON 

當您完成後,您需要再次關閉它。

Set Identity_Insert [table] OFF 
+0

我不會更新或插入新記錄。即時通訊使用來自其他數據庫的數據爲預加載列創建標識,但是此新表沒有任何依賴關係,我不知道管理工作室如何在不丟棄任何對象的情況下執行此操作 – hexehell00 2014-10-31 02:54:24

+0

如果您要從其他數據庫複製數據你在數據庫方面做的是將數據插入表中。要做到這一點,你需要設置身份插入。看到我的編輯上面的答案。 – 2014-10-31 15:10:39