C# 如何将.NET对象集合(父-子)层次结构传递给SQL Server存储过程
我需要将.NET集合传递给存储过程。我的收藏有1000张唱片。每条记录包含2-3个其他类型的子对象 我只需要通过从.NET调用存储过程立即插入它们 我已经尝试了一个TVP(表值参数),但它根本不能满足我的需要 对于每个根级记录,我需要通过传递根记录及其对应的子记录来调用存储过程。这使得整个过程非常缓慢 这就是为什么我在寻找一种方法,这样我可以一次传递整个层次结构列表,在存储过程中,通过循环和迭代子记录,我可以插入父-子记录C# 如何将.NET对象集合(父-子)层次结构传递给SQL Server存储过程,c#,sql-server,stored-procedures,bulkinsert,table-valued-parameters,C#,Sql Server,Stored Procedures,Bulkinsert,Table Valued Parameters,我需要将.NET集合传递给存储过程。我的收藏有1000张唱片。每条记录包含2-3个其他类型的子对象 我只需要通过从.NET调用存储过程立即插入它们 我已经尝试了一个TVP(表值参数),但它根本不能满足我的需要 对于每个根级记录,我需要通过传递根记录及其对应的子记录来调用存储过程。这使得整个过程非常缓慢 这就是为什么我在寻找一种方法,这样我可以一次传递整个层次结构列表,在存储过程中,通过循环和迭代子记录,我可以插入父-子记录 我怎样才能做到这一点 事实上,我三周前才这么做 创建一个“temp”关联
我怎样才能做到这一点 事实上,我三周前才这么做
事实上,我三周前才这么做
您可以使用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>'
结果看起来像
ParentValue ChildValue
213 1111
213 1112
2313 3332
2313 3333
您可以使用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>'
结果看起来像
ParentValue ChildValue
213 1111
213 1112
2313 3332
2313 3333
尝试使用XML并将其解压缩到存储过程中的临时表中。它对我来说运行得相当快。表值参数是一种很好的方法。只需一次传递两个表,一个为父表,另一个为子表,并传递一些键来关联它们。@Alejandro:目前,我传递的方式几乎相同。但我不是将整个父项作为一个表传递,将整个子项作为另一个表传递,而是将一个父项记录及其对应的子项列表一起传递。但这真的很慢,因为我需要插入100K父记录。此外,每个单亲家庭都有3-4个孩子,这可能是问题的根源。试着一次完成所有的任务,而不是一个接一个地去做。我想大部分开销来自重复的网络往返,而不是查询本身。是的,这就是我所知道的。因此,解决方案是一次传递整个层次结构,然后让SQL在内部完成它的工作。所以问题就归结为:如何一次传递整个层次结构(例如,列表委托,其中每个委托包含列表),尝试使用XML并将其解包到存储过程中的临时表中。它对我来说运行得相当快。表值参数是一种很好的方法。只需一次传递两个表,一个为父表,另一个为子表,并传递一些键来关联它们。@Alejandro:目前,我传递的方式几乎相同。但我不是将整个父项作为一个表传递,将整个子项作为另一个表传递,而是将一个父项记录及其对应的子项列表一起传递。但这真的很慢,因为我需要插入100K父记录。此外,每个单亲家庭都有3-4个孩子,这可能是问题的根源。试着一次完成所有的任务,而不是一个接一个地去做。我想大部分开销来自重复的网络往返,而不是查询本身。是的,这就是我所知道的。因此,解决方案是一次传递整个层次结构,然后让SQL在内部完成它的工作。所以问题就归结为:如何一次传递整个层次结构(例如列表委托,其中每个委托都包含列表),很抱歉,我根本不能使用XML。这在应用程序中是额外的。我一次处理100K条记录,用单亲记录构造内存中的xml,其中包含80列,包含10列子项,这是一个非常糟糕的主意。很抱歉,我根本不能使用xml。这在应用程序中是额外的。我一次处理100K条记录,用包含10列子项的80列的单亲记录构造内存中的xml是一个非常糟糕的主意。Keith:你能告诉我如何将父子层次列表从.NET传递到存储过程吗?我不想在传递整个列表时破坏父子层次结构。因为,以后将很难将每个子实体与其对应的父实体相关联。我在回答中编写了代码示例(本文中的第二个链接),但仅限于sql部分。你需要.net端示例吗?是的,如果你能管理详细答案,非常好:-)@Usman您知道如何从列表中填充数据表吗?是的,我知道如何在c中填充数据表,以便将其作为TVPKeith传递给存储过程。您能告诉我如何将父子层次结构列表从.NET传递给存储过程吗?我不想