在我的应用程序中,我有大量需要插入数据库的数量(100+)的行。一旦他们被插入到数据库中,我需要插入他们的孩子,这些孩子有一个外键引用给孩子。如何使用Table-Valued参数插入多行然后返回它们的ID?
我想知道是否有办法编写一个存储过程,可以插入所有这些行并将其ID返回给我的应用程序?
在我的应用程序中,我有大量需要插入数据库的数量(100+)的行。一旦他们被插入到数据库中,我需要插入他们的孩子,这些孩子有一个外键引用给孩子。如何使用Table-Valued参数插入多行然后返回它们的ID?
我想知道是否有办法编写一个存储过程,可以插入所有这些行并将其ID返回给我的应用程序?
您已使用表值参数标记了您的问题 - 您可以将其中一个传递给存储过程以插入数据库。
可以使用OUTPUT
子句和INSERTED
逻辑表获取新的ID值,并从存储过程返回这些值。
下面是使用output
子句的示例,如Oded建议的。首先,一些设置代码:
if exists (select * from tempdb.sys.tables where name like '#tmp%')
drop table #tmp
create table #tmp (id int identity, FirstName varchar(50), LastName varchar(50))
if exists (select * from sys.procedures where name = 'TestProcedure')
drop procedure TestProcedure
if exists (select * from sys.types where name = 'TestTableType')
drop type TestTableType
create type TestTableType as table (FirstName varchar(50), LastName varchar(50))
go
现在,我们可以创建存储过程:
create procedure dbo.TestProcedure
@List TestTableType readonly
as
insert #tmp
(FirstName, LastName)
output inserted.*
select FirstName
, LastName
from @List l
go
注意output
子句,它告诉SQL Server返回插入的行返回给客户端,其中包括价值的身份专栏。既然代码设置完毕,我们可以测试它:
declare @List TestTableType
insert @List values ('Rick','Cain'),
('Herman', 'Gingrich'),
('Newt', 'Paul'),
('Ron', 'Perry')
exec dbo.TestProcedure @List
select * from #tmp
你会看到,由过程返回的值#tmp
匹配值完全相同。
我会做类似于Andomar建议,但使用这里所描述的 “INSERT-EXEC” 技术的东西:
http://www.sommarskog.se/tableparam.html
在链接,搜索:INSERT-EXEC
我我仍然在研究如何做到这一点,但在我看来,如果你想插入一个父表和一个子表,可以用一个SQL调用通过将两个表作为表值参数来完成。如果你有一些人为的同一性(关系),它当前将两个表连接成一个行号,但并不是必要地存储在任何数据库表中,那么当插入父级并获取其身份值时,它可以连接到子表使用独特的关系和孩子的外键可以更新。然后可以插入孩子。
输出很有意思,但我实际上并不需要输出,它只是在sproc中使用,所以我必须做更多的研究以查看输出是否可以被使用,例如输出它到一个临时表。
回答我的问题对于输出语法是:
[ OUTPUT <dml_select_list> INTO { @table_variable | output_table } [ (column_list) ] ]
,因此它可以被用来创建一个加入了与儿童的临时表。
你应该问一个新问题并自己回答 – j0k
这有一个坏计划的气味。为什么这样,你认为它会更快?只是一个一个地做 - 少问题恕我直言http://stackoverflow.com/questions/312003/what-is-the-mostridiculous-pessimization-youve-seen – Hogan
@霍根 - 这实际上是一个非常好的优化。单个数据库调用的性能将远高于100。浏览网络非常昂贵。 – Oded
@Oded - 他仍然需要为每个孩子打个电话;把父母和孩子交给一个SP并打100个电话而不是101个电话会更好吗?该计划还可以减少网络流量 - 不需要将ID传递回逻辑层。 – Hogan