[sql] 获取插入行身份的最佳方法?


Answers

我相信检索插入ID的最安全和最准确的方法是使用输出子句。

例如(取自以下MSDN文章)

USE AdventureWorks2008R2;
GO
DECLARE @MyTableVar table( NewScrapReasonID smallint,
                           Name varchar(50),
                           ModifiedDate datetime);
INSERT Production.ScrapReason
    OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate
        INTO @MyTableVar
VALUES (N'Operator error', GETDATE());

--Display the result set of the table variable.
SELECT NewScrapReasonID, Name, ModifiedDate FROM @MyTableVar;
--Display the result set of the table.
SELECT ScrapReasonID, Name, ModifiedDate 
FROM Production.ScrapReason;
GO
Question

插入行的IDENTITY的最佳方式是什么?

我知道@@IDENTITYIDENT_CURRENTSCOPE_IDENTITY但不了解每个人的优缺点。

有人能解释一下这些差异,以及我应该什么时候使用它们?




当您使用实体框架时,它在内部使用OUTPUT技术返回新插入的ID值

DECLARE @generated_keys table([Id] uniqueidentifier)

INSERT INTO TurboEncabulators(StatorSlots)
OUTPUT inserted.TurboEncabulatorID INTO @generated_keys
VALUES('Malleable logarithmic casing');

SELECT t.[TurboEncabulatorID ]
FROM @generated_keys AS g 
   JOIN dbo.TurboEncabulators AS t 
   ON g.Id = t.TurboEncabulatorID 
WHERE @@ROWCOUNT > 0

输出结果存储在临时表变量中,并返回到表中,并将行值从表中返回。

注意:我不知道为什么EF会内部将短暂表加回到真正的表(在什么情况下两个不匹配)。

但这就是EF所做的。

此技术( OUTPUT )仅适用于SQL Server 2008或更新版本。




获取新插入行的身份的最佳(读取:最安全)方法是使用output子句:

create table TableWithIdentity
           ( IdentityColumnName int identity(1, 1) not null primary key,
             ... )

-- type of this table's column must match the type of the
-- identity column of the table you'll be inserting into
declare @IdentityOutput table ( ID int )

insert TableWithIdentity
     ( ... )
output inserted.IdentityColumnName into @IdentityOutput
values
     ( ... )

select @IdentityValue = (select ID from @IdentityOutput)



在你的插入语句之后,你需要添加这个。 并确保数据插入的表名。您将获得当前行号,其中行受到插入语句的影响。

IDENT_CURRENT('tableName')



MSDN

@@ IDENTITY,SCOPE_IDENTITY和IDENT_CURRENT是类似的函数,它们返回插入到表的IDENTITY列中的最后一个值。

@@ IDENTITY和SCOPE_IDENTITY将返回当前会话中任何表中生成的最后一个标识值。 但是,SCOPE_IDENTITY仅在当前范围内返回值; @@ IDENTITY不限于特定范围。

IDENT_CURRENT不受范围和会话的限制; 它仅限于指定的表格。 IDENT_CURRENT返回为任何会话和任何范围中的特定表生成的标识值。 有关更多信息,请参阅IDENT_CURRENT。

  • IDENT_CURRENT是一个以表格作为参数的函数。
  • 在桌面上有触发器时, MSDN可能会返回混淆结果
  • SCOPE_IDENTITY大部分时间都是你的英雄。



Related