簡體   English   中英

如何將.NET對象集合(父級-子級)層次結構傳遞給SQL Server存儲過程

[英]How to pass .NET Collection of objects (Parent-Child) hierarchy to a SQL Server stored procedure

我需要將.NET集合傳遞給存儲過程。 我的收藏包含1000條記錄。 每個記錄包含2-3個其他類型的子對象。

我需要通過.NET調用存儲過程一次插入它們。

我已經嘗試過TVP(表值參數),但這根本不能滿足我的需求。

對於每個根級別記錄,我都需要通過傳遞根記錄及其相應的子記錄來調用存儲過程。 這使整個過程非常緩慢。

這就是為什么我要尋找一種方法,以便我可以一次循環通過整個層次結構列表,並在存儲過程內部通過循環和迭代子記錄來插入父子記錄。

我該如何實現?

我實際上在3周前就做了。

  1. 創建一個“臨時”關聯密鑰(我使用了GUID)將父級和子級鏈接在一起,因為您沒有數據庫ID(臨時密鑰永遠不會保存在數據庫中)
  2. 調用TVP存儲過程。 在兩個單獨的表變量中傳遞所有父母和所有孩子
  3. 創建一個臨時表或表var來存儲臨時/數據庫ID關系
  4. 使用帶有OUTPUT的merge語句將Inserted.Id值和臨時ID放入步驟3中創建的臨時表中
  5. 使用CTE和merge語句使用父記錄中的實際DB ID插入子記錄

這里有一些帶有“真實”示例的有關過程的鏈接:

合並父子SQL Server表

T-SQL-將數據插入父表和子表

您可以使用XML將記錄及其子級傳遞給存儲過程。 例如

DECLARE @xml XML = '<root>
<parent value="213">
    <child childValue="1111"></child>
    <child childValue="1112"></child>
</parent>
<parent value="2313">
    <child childValue="3333"></child>
    <child childValue="3332"></child>
</parent>
</root>'

然后,您可以執行多種方法,其中一種方法是對記錄進行非規范化並將其保存到臨時表中以進行進一步處理

    SELECT
    T.c.value('parent::*/@value', 'INT') AS ParentValue,
    T.c.value('@childValue', 'INT') AS ChildValue
    FROM @xml.nodes('/root[1]/parent/child') T(c)

結果看起來像

    ParentValue  ChildValue
    213          1111
    213          1112
    2313         3332
    2313         3333

暫無
暫無

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

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