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