2011-11-05 54 views
3

在我的应用程序中,我有大量需要插入数据库的数量(100+)的行。一旦他们被插入到数据库中,我需要插入他们的孩子,这些孩子有一个外键引用给孩子。如何使用Table-Valued参数插入多行然后返回它们的ID?

我想知道是否有办法编写一个存储过程,可以插入所有这些行并将其ID返回给我的应用程序?

+0

这有一个坏计划的气味。为什么这样,你认为它会更快?只是一个一个地做 - 少问题恕我直言http://stackoverflow.com/questions/312003/what-is-the-mostridiculous-pessimization-youve-seen – Hogan

+0

@霍根 - 这实际上是一个非常好的优化。单个数据库调用的性能将远高于100。浏览网络非常昂贵。 – Oded

+0

@Oded - 他仍然需要为每个孩子打个电话;把父母和孩子交给一个SP并打100个电话而不是101个电话会更好吗?该计划还可以减少网络流量 - 不需要将ID传递回逻辑层。 – Hogan

回答

3

您已使用表值参数标记了您的问题 - 您可以将其中一个传递给存储过程以插入数据库。

可以使用OUTPUT子句和INSERTED逻辑表获取新的ID值,并从存储过程返回这些值。

3

下面是使用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匹配值完全相同。

0

我我仍然在研究如何做到这一点,但在我看来,如果你想插入一个父表和一个子表,可以用一个SQL调用通过将两个表作为表值参数来完成。如果你有一些人为的同一性(关系),它当前将两个表连接成一个行号,但并不是必要地存储在任何数据库表中,那么当插入父级并获取其身份值时,它可以连接到子表使用独特的关系和孩子的外键可以更新。然后可以插入孩子。

输出很有意思,但我实际上并不需要输出,它只是在sproc中使用,所以我必须做更多的研究以查看输出是否可以被使用,例如输出它到一个临时表。

回答我的问题对于输出语法是:

[ OUTPUT <dml_select_list> INTO { @table_variable | output_table } [ (column_list) ] ] 

,因此它可以被用来创建一个加入了与儿童的临时表。

+0

你应该问一个新问题并自己回答 – j0k

相关问题