簡體   English   中英

C#使用不在SQL Server中的數據表中的值使用SQL更新數據庫表

[英]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邏輯的解決方案或建議。

  1. 取得數據表(C#)並將其轉換為xml。 提示,如果將數據表添加到數據集,則可以調用ds.GetXml()。 (請參閱此處

  2. 將xml推送到sql-server。

  3. 使用sql-server-xml功能將xml“切碎”到#temp或@variable表中。

  4. 使用#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上有一個古老的“性能”錯誤。

https://connect.microsoft.com/SQLServer/feedback/details/250407/insert-from-nodes-with-element-based-xml-has-poor-performance-on-sp2-with-x64

它可能不再適用。 但這是要注意的。 “回溯”(由於注入的錯誤)​​,我的團隊和我不得不將基於元素的xml更改為基於屬性的xml(在C#中),然后再將其發送到sql-server。

我認為最簡單的方法是使用SqlBulkCopy將應用程序數據批量插入到臨時表中。 如果要分批設置,還有一個選項可以設置批量大小

批量插入后,運行存儲過程以進行更新。 另一個選擇是使用插入后觸發器,但這似乎僅在批量批量插入時才有意義。

暫無
暫無

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

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