早上好。我有两个表,一个引用另一个。当我插入主表时,主键是自动生成的,即身份字段。我需要将此值插入第二个表。
我发现使用OUTPUT子句会给我刚刚插入的标识值,所以我试过这个。
insert into owners (pId)
insert into personal (firstName)
output inserted.pId
values ('fn')
虽然不起作用。我收到一个错误:
关键字“insert”
附近的语法不正确
个人表是主表,owner表包含外键。 如何在SQL Server中执行所需的操作?
过去两天我在这里被搞砸了......
答案 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),也可以将这些值输出到临时表或永久表中。
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