Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将.NET对象集合(父-子)层次结构传递给SQL Server存储过程_C#_Sql Server_Stored Procedures_Bulkinsert_Table Valued Parameters - Fatal编程技术网

C# 如何将.NET对象集合(父-子)层次结构传递给SQL Server存储过程

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”关联

我需要将.NET集合传递给存储过程。我的收藏有1000张唱片。每条记录包含2-3个其他类型的子对象

我只需要通过从.NET调用存储过程立即插入它们

我已经尝试了一个TVP(表值参数),但它根本不能满足我的需要

对于每个根级记录,我需要通过传递根记录及其对应的子记录来调用存储过程。这使得整个过程非常缓慢

这就是为什么我在寻找一种方法,这样我可以一次传递整个层次结构列表,在存储过程中,通过循环和迭代子记录,我可以插入父-子记录


我怎样才能做到这一点

事实上,我三周前才这么做

  • 创建一个“temp”关联键(我使用了一个GUID)将父项和子项链接在一起,因为您没有数据库ID(temp键永远不会保存在数据库中)
  • 调用TVP存储过程。在两个单独的表格变量中传递所有家长和所有孩子
  • 创建临时表或表变量以存储临时id/数据库id关系
  • 使用带有输出的merge语句将插入的.Id值和temp Id获取到步骤3中创建的temp表中
  • 使用CTE和merge语句使用父记录中的实际DB id插入子记录
  • 以下是关于流程的几个链接,并附有“真实”示例:


    事实上,我三周前才这么做

  • 创建一个“temp”关联键(我使用了一个GUID)将父项和子项链接在一起,因为您没有数据库ID(temp键永远不会保存在数据库中)
  • 调用TVP存储过程。在两个单独的表格变量中传递所有家长和所有孩子
  • 创建临时表或表变量以存储临时id/数据库id关系
  • 使用带有输出的merge语句将插入的.Id值和temp Id获取到步骤3中创建的temp表中
  • 使用CTE和merge语句使用父记录中的实际DB id插入子记录
  • 以下是关于流程的几个链接,并附有“真实”示例:


    您可以使用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传递给存储过程吗?我不想