[英]C# update database table using SQL using values from a DataTable that is not in SQL Server
我有一個SQL Server數據庫表,需要使用從外部源檢索到的C#應用程序DataTable
中的值進行更新(它可以來自文件,外部API調用等,我想這是不相關的)。
有沒有一種方法可以使用SQL進行“大量”更新,類似於:
UPDATE myTable1 t1
SET custAddress = t2.address
FROM myTable2 t2
WHERE t1.id = t2.id
我想我可以使用上面的示例,只要兩個表都在同一個SQL Server數據庫中即可。 但是在這種情況下, myTable2
是應用程序(C#) DataTable
而不是SQL Server表。
有沒有一種方法可以完成與上述更新類似的更新?
我知道我可以“遍歷”應用程序表的每一行並觸發每一行的SQL更新,但是如果我的數據表有數千行,我將不希望(只要有可能)就必須對每一行執行一次SQL更新我需要更新的行。
任何幫助,將不勝感激。 我願意接受涉及LINQ或任何其他C#或SQL邏輯的解決方案或建議。
取得數據表(C#)並將其轉換為xml。 提示,如果將數據表添加到數據集,則可以調用ds.GetXml()。 (請參閱此處 )
將xml推送到sql-server。
使用sql-server-xml功能將xml“切碎”到#temp或@variable表中。
使用#temp或@variable表中的數據執行CUD(創建/更新/刪除)操作。
基本思想在這里:
HOW TO:在Visual C#.NET中使用OpenXML和.NET提供程序執行批量更新和插入
但是,您不想使用OPENXML(Sql Server 2000語法),而是使用示例“在此處找到切碎:
http://pratchev.blogspot.com/2007/06/shredding-xml-in-sql-server-2005.html
恕我直言:這是對CUD(創建/更新/刪除)執行“基於集合”操作的好方法。 這樣做的最大好處之一是,所有索引更新都發生在基於集合的操作之后,如果您執行RBAR(行遍歷行),則必須在每個單個操作之后重建索引。 :(
注意,#3(b)是可選的。 你必須切碎。 但是,您可以直接從xml-shredding轉到“真實”表(並跳過#temp或@variable表)。 我通常會測試現實世界中的“負載”(xml數據量),如果沒有太大區別,我會堅持使用#temp或@variable表。 它以后更容易調試,因為您可以放入臨時“ select from from #myTempTable”,然后查看數據是否被正確粉碎。 您還應該測試#temp與@variable表。 有時會有所作為。
請注意,element-based-xml上有一個古老的“性能”錯誤。
它可能不再適用。 但這是要注意的。 “回溯”(由於注入的錯誤),我的團隊和我不得不將基於元素的xml更改為基於屬性的xml(在C#中),然后再將其發送到sql-server。
我認為最簡單的方法是使用SqlBulkCopy將應用程序數據批量插入到臨時表中。 如果要分批設置,還有一個選項可以設置批量大小 。
批量插入后,運行存儲過程以進行更新。 另一個選擇是使用插入后觸發器,但這似乎僅在批量批量插入時才有意義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.