1

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

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

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

但它不起作用。我收到一个错误:

关键字“插入”附近的语法不正确

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

这两天我一直卡在这里...

4

6 回答 6

4

我认为您只是稍微偏离了语法-您绝对可以将值插入主表并使用该OUTPUT子句将它们插入到辅助表中。

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

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

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

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

于 2012-06-21T05:36:16.630 回答
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也可以,但仅限于一个值。

于 2012-06-21T04:59:04.307 回答
3

尝试以下步骤

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

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

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

试试这个它会为你工作。

于 2012-06-21T05:01:15.073 回答
2

我认为您的选择是使用SCOPE_IDENTITY(),但另一个最接近您的选择是IDENT_CURRENT(‘tablename’)我想,我也会发布其他身份选项的详细信息,这可能会帮助您理解您的选择,并可能在其他时候有所帮助

@@IDENTITY 它返回在连接上生成的最后一个 IDENTITY 值,而与生成该值的表无关,也与生成该值的语句的范围无关。


SCOPE_IDENTITY() 它返回连接上和同一范围内的语句产生的最后一个 IDENTITY 值,而不考虑产生该值的表。


IDENT_CURRENT('tablename') 它返回表中生成的最后一个 IDENTITY 值,与创建该值的连接无关,也与生成该值的语句的范围无关。

于 2012-06-21T04:45:25.427 回答
2

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

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

INSERT INTO [Owners] (Colums ....) VALUES (@id ....)
于 2012-06-21T04:35:09.810 回答
0

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

于 2013-03-27T00:03:50.640 回答