2012-08-23 56 views
-2

我在TablesAs KeyA列上的TableB上有两个带有外键约束的表。直到现在我还在进行手动插入,因为他们只有几行要添加。现在我需要做一个批量插入,所以我的问题是,如果我在TableA中插入多行,我怎么能得到所有这些身份值,并将其插入TableB以及其他列值。请参阅下面的脚本。获取插入的表标识值并更新另一个表

INSERT INTO Tablea 
     ([KeyA] 
     ,[Value]) 
    SELECT 4 ,'StateA' 
UNION ALL 
SELECT 5 ,'StateB' 
UNION ALL 
SELECT 6 ,'StateC' 

INSERT INTO Tableb 
     ([KeyB] 
     ,[fKeyA] //Get value from the inserted row from TableA 
     ,[Desc]) 
SELECT 1 ,4,'Value1' 
UNION ALL 
SELECT 2 ,5,'Value2' 
UNION ALL 
SELECT 3 ,6, 'Value3' 
+4

什么版本的SQL Server?看看[OUTPUT子句](http://msdn.microsoft.com/en-us/library/ms177564.aspx)。我会提供一个答案,但你对奖励帮助你的人不感兴趣。 –

回答

0

Scope identity sometimes returns incorrect value。请参阅解决方法部分中OUTPUT的使用。

+3

SCOPE_IDENTITY()在这里无效 - 注意初始命令插入多行; SCOPE_IDENTITY()只返回最后一个。 –

+0

@AaronBertrand - 是的,OP中很清楚。该引用提供了一个使用'OUTPUT'的例子,并提供给那些处理单个行的人,他们可能希望探索标准技术的替代方法:MAX(ID),@@ IDENTITY, 'IDENT_CURRENT('TABLE_NAME')','SCOPE_IDENTITY()'。谢谢你对我的评价。 – HABO

+3

这不一定适合你,但也适用于其他读者。 –

2

您可以使用INSERT的OUTPUT子句来执行此操作。下面是一个示例:

CREATE TABLE #temp (id [int] IDENTITY (1, 1) PRIMARY KEY CLUSTERED, Val int) 

CREATE TABLE #new (id [int], val int) 

INSERT INTO #temp (val) OUTPUT inserted.id, inserted.val INTO #new VALUES (5), (6), (7) 

SELECT id, val FROM #new 

DROP TABLE #new 
DROP TABLE #temp 

返回的结果集包括插入的IDENTITY值。

+0

这看起来很有趣。我可以使用OUTPUT子句以插入的顺序可靠地获取插入的ID吗?我真的想插入一个大的数据表,并以正确的顺序返回ID号码,而不必重新传输整个数据包。 –

+1

@Ted它是一个集合,为什么命令很重要?输出子句中的ID值将与在初始插入中分配给该值的值相关联。一张表是一组无序的行,所以不要在订单中挂得太紧 - 重要的是,如果StateA在插入期间获得了200的标识值,则第二个表200中的标识值将与正确的行相关联。它不会基于“订单”来做到这一点。 –

+0

我正在写一个C#程序,它使用表参数插入插入几百万行。是否有可能为每一行取回正确的标识值并将它们可靠地分配给我的C#对象?我知道我可以简单地检索scope_identity()值并将每行的ID分配为'(ending_identity_value - (number_of_rows_inserted - row_number))'。但是我担心我可能太聪明了,我的代码在所有情况下都不可靠,所以大多数情况下我只是设计程序,以便插入后不需要身份证号码。 –

相关问题