将标识列值插入另一个表

时间:2012-06-21 04:31:54

标签: sql-server sql-server-2005 insert identity-column

早上好。我有两个表,一个引用另一个。当我插入主表时,主键是自动生成的,即身份字段。我需要将此值插入第二个表。

我发现使用OUTPUT子句会给我刚刚插入的标识值,所以我试过这个。

insert into owners (pId) 
   insert into personal (firstName) 
   output inserted.pId 
   values ('fn')

虽然不起作用。我收到一个错误:

  

关键字“insert”

附近的语法不正确

个人表是主表,owner表包含外键。 如何在SQL Server中执行所需的操作?

过去两天我在这里被搞砸了......

6 个答案:

答案 0 :(得分:4)

我认为你的语法略有偏差 - 你绝对可以将值插入主表并使用OUTPUT子句将它们插入到辅助表中。

INSERT INTO dbo.personal(firstName) 
OUTPUT INSERTED.pId INTO dbo.owners(pId) 
VALUES('fn')

这会在personal中插入新行,并将列firstName设置为fn。然后,插入行的标识列pId将插入到另一个表owners中,作为该表的pId列。

有关详细信息,请参阅MSDN documentation on the OUTPUT clause - 您可以将任何插入的值输出到控制台(例如SQL Server Mgmt Studio),也可以将这些值输出到临时表或永久表中。

更新:正如'dradu'指出的那样 - 这种方法在这种情况下不起作用,因为owners表中的列是FK约束的一部分(I从你的问题中错过了这一点)。因此,您需要使用其他方法来执行此操作 - 可能会将必要的信息输出到代码中的临时表/表变量中

答案 1 :(得分:3)

由于外键不能直接使用OUTPUT子句,您可以将生成的ID添加到临时表中,然后将这些值插入owners表中:

BEGIN TRANSACTION 

CREATE TABLE #ids(ID INT)
INSERT INTO personal(firstName)
    OUTPUT inserted.pid INTO #ids
    SELECT 'A'
    UNION SELECT 'B'

INSERT INTO owners(pid)
    SELECT ID FROM #ids

COMMIT TRANSACTION

SCOPE_IDENTITY也可以使用,但它只限于一个值。

答案 2 :(得分:3)

尝试以下步骤

1)在插入时应用事务级别

2)使用Scope_Identity()函数获取最后插入的id。

当您应用事务级别时,它将锁定您的表,而其他/同一用户无法在此时插入值。

试试这个会对你有用。

答案 3 :(得分:2)

您可以使用SCOPE_IDENTITY()函数返回插入的标识值。

DECLARE @id INT
INSERT INTO [Personal] (Colums ....) VALUES (this, that, stuff)
SET @id = SCOPE_IDENTITY()

INSERT INTO [Owners] (Colums ....) VALUES (@id ....)

答案 4 :(得分:2)

我认为您的选择是使用SCOPE_IDENTITY()但是最接近您选项的是IDENT_CURRENT(‘tablename’)所以我想,我发布了其他身份选项的详细信息,这可能有助于您了解选择,并可能在其他时间有用

  

@@ IDENTITY       它返回连接上生成的最后一个IDENTITY值,而不管生成该值的表是什么,而不管它是什么   产生价值的陈述的范围。


  

SCOPE_IDENTITY()返回生成的最后一个IDENTITY值    一个连接和一个声明在同一范围内,无论如何    产生价值的表。


  

IDENT_CURRENT('tablename')它返回最后一个IDENTITY值        在表中生成,无论创建的连接如何        值,而不管产生的语句的范围        值。

答案 5 :(得分:0)

以下是使用SCOPE_IDENTITY()获取最新身份值的一个简单示例 http://msdn.microsoft.com/en-us/library/ms190315.aspx