sql t-sql教程 - 获取插入行身份的最佳方法?





t-sql是什么 select (9)


我相信检索插入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

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

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

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




MSDN

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

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

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

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



获取新插入行的身份的最佳(读取:最安全)方法是使用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')



总是使用scope_identity(),从不需要其他任何东西。




我说的和其他人一样,所以每个人都是对的,我只是想说清楚。

@@IDENTITY返回客户端连接到数据库的最后一个事件的ID。
大多数时候这工作正常,但有时触发器会插入一个你不知道的新行,并且你会从这个新行获得ID,而不是你想要的

SCOPE_IDENTITY()解决了这个问题。 它返回发送到数据库的SQL代码中插入的最后一个内容的ID。 如果触发器去创建额外的行,它们不会导致返回错误的值。 万岁

IDENT_CURRENT返回任何人插入的最后一个ID。 如果其他应用恰好在不幸的时间插入另一行,您将获得该行的ID而不是您的ID。

如果您想安全玩,请始终使用SCOPE_IDENTITY() 。 如果你坚持使用@@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或更新版本。




SELECT CAST(scope_identity() AS int);

然后到你的插入sql语句的末尾

NewId = command.ExecuteScalar()

将检索它。




查找下面的聚集索引和非聚集索引的一些特征:

聚集索引

  1. 聚集索引是唯一标识SQL表中的行的索引。
  2. 每个表格可以只有一个聚集索引。
  3. 您可以创建一个涵盖多个列的聚集索引。 例如: create Index index_name(col1, col2, col.....)
  4. 默认情况下,具有主键的列已具有聚簇索引。

非聚集索引

  1. 非聚簇索引就像简单的索引。 它们仅用于快速检索数据。 不确定有独特的数据。




sql sql-server tsql