Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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
Sql server 用于插入三级层次结构的SQL Server存储过程_Sql Server_Sql Server 2008_Stored Procedures - Fatal编程技术网

Sql server 用于插入三级层次结构的SQL Server存储过程

Sql server 用于插入三级层次结构的SQL Server存储过程,sql-server,sql-server-2008,stored-procedures,Sql Server,Sql Server 2008,Stored Procedures,给定的业务对象类似于: public class MyBase { public int Id { get; set; } } public class Parent : MyBase { public List<Child> Children { get; set; } // Additional objects with 1:1 relationship } public class Child : MyBase { public Parent

给定的业务对象类似于:

public class MyBase
{
    public int Id { get; set; }
}

public class Parent : MyBase
{
    public List<Child> Children { get; set; }
    // Additional objects with 1:1 relationship
}

public class Child : MyBase
{
    public Parent Parent { get; set; }
    public List<Grandchild> Grandchildren { get; set; }
    // Some other properties
}   

public class GrandChild : MyBase
{
    public Child { get; set; }
    // Some other properties including a timestamp
}
但是,我想更进一步,创建一个存储过程,它接受父对象的数据,然后为每个子对象创建关联的
列表和
列表

从概念上讲,我不知道如何在存储过程中实现这一点


我可以使用什么策略传入该类型的数据结构并在存储过程中处理它?

我猜您编写了存储过程,为了输入父级和子级,其中一个选项是以xml格式发送数据,这同样可以很容易地从父对象中提取,并利用存储过程的强大功能进行事务处理。

文章仍然很好。通过将对象图作为XML传递,我们获得了最好的性能。表值参数更干净,但速度较慢。我喜欢Andromar的建议,您可以使用
SELECT
遍历分层XML,非常容易地将子代和子代作为XML抓取(好文章)然后将整个混乱发送到一个等待的存储过程,该存储过程有一个
xml
类型的输入参数。@Andomar:Erland说xml可能比TVPs慢很多。导入现在运行3小时(EF为8小时),因此我希望每个性能优势都是可能的(数据将在未来2-3年内显著增长,因此运行时间将增加)。哦,我还以为你在寻求优化网页加载:)对于大量数据,请看一看,它不需要存储过程就可以工作,并且需要目标服务器上的管理员权限,但它非常快,似乎SqlBulkCopy一次只能在一个表上工作。尽管如此,这个问题的公认答案确实指向了一个可能的解决方案。我认为这并没有涵盖OP所解释的问题。
CREATE TYPE tvpInt32List AS TABLE (n int NOT NULL)

CREATE PROCEDURE uspInsertChild @parentId INT, @fk1Id INT, @fk2Id INT, 
@listValues tvpInt32List READONLY 
AS
DECLARE @id INT

BEGIN TRANSACTION   

BEGIN TRY   
    INSERT INTO dbo.Children VALUES(@fk2Id, @fk1Id, NULL, 0, 1, NULL, NULL, NULL, NULL, NULL, @fk1Id, @parentId)

    SET @Id = SCOPE_IDENTITY() 

    INSERT INTO dbo.Grandchildren SELECT n, '', GETDATE(), @id FROM @listValues

    COMMIT TRANSACTION
END TRY

BEGIN CATCH
    ROLLBACK TRANSACTION
END CATCH