sql 中获取最后生成的标识值 IDENT_CURRENT ,@@IDENTITY ,SCOPE_IDENTITY 的用法和区别

本文详细介绍了SQL Server中的标识函数IDENT_CURRENT及其用法。通过对比@@IDENTITY和SCOPE_IDENTITY等函数,阐述了IDENT_CURRENT如何返回特定表在任何会话和作用域中最后生成的标识值,并提供了具体的示例。

转载自:http://blog.youkuaiyun.com/jinho/article/details/5267507

IDENT_CURRENT

返回为任何会话和任何作用域中的指定表最后生成的标识值。

语法

IDENT_CURRENT('table_name')

参数

table_name

是将要返回其标识值的表的名称。table_name 的数据类型为 varchar,没有默认值。

返回类型

sql_variant

注释

IDENT_CURRENT 类似于 Microsoft® SQL Server™ 2000 标识函数 SCOPE_IDENTITY 和 @@IDENTITY。这三个函数都返回最后生成的标识值。但是,它们在定义"最后"的作用域和会话上不同。

  • IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。
  • @@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。
  • SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值。
示例

下面的示例说明由 IDENT_CURRENT、@@IDENTITY 和 SCOPE_IDENTITY 返回的不同的标识值。

USE pubs
DROP TABLE t6
DROP TABLE t7
GO
CREATE TABLE t6(id int IDENTITY)
CREATE TABLE t7(id int IDENTITY(100,1))
GO
CREATE TRIGGER t6ins ON t6 FOR INSERT 
AS
BEGIN
   INSERT t7 DEFAULT VALUES
END
GO
--end of trigger definition

SELECT   * FROM t6
--id is empty.

SELECT   * FROM t7
--id is empty.

--Do the following in Session 1
INSERT t6 DEFAULT VALUES
SELECT @@IDENTITY      
/*Returns the value 100, which was inserted by the trigger.*/

SELECT SCOPE_IDENTITY()   
/* Returns the value 1, which was inserted by the 
INSERT stmt 2 statements before this query.*/

SELECT IDENT_CURRENT('t7')
/* Returns value inserted into t7, i.e. in the trigger.*/

SELECT IDENT_CURRENT('t6')
/* Returns value inserted into t6, which was the INSERT statement 4 stmts before this query.*/

-- Do the following in Session 2
SELECT @@IDENTITY
/* Returns NULL since there has been no INSERT action 
so far in this session.*/

SELECT SCOPE_IDENTITY()
/* Returns NULL since there has been no INSERT action 
so far in this scope in this session.*/

SELECT IDENT_CURRENT('t7')
/* Returns the last value inserted into t7.*/
具体:sql帮助文档

 

SQL Server 中,`SELECT SCOPE_IDENTITY()` 是一种常用的方法,用于获取最近插入记录的自增标识。该函数返回的是当前作用域内(即当前的存储过程、触发器或批处理)插入到标识列中的最后一个标识。与 `@@IDENTITY` `IDENT_CURRENT` 相比,`SCOPE_IDENTITY()` 更加精确,因为它仅限于当前作用域,避免了跨作用域返回不相关的标识。 当向数据库表中插入一行数据时,如果表中的某列被配置为自增标识列(通常是主键列),数据库会自动为每个插入的行分配一个唯一的。插入操作完成后,可以通过执行 `SELECT SCOPE_IDENTITY()` 查询来获取刚刚插入行的标识。这种方式特别适用于需要立即获取新插入记录主键的场景,例如在插入数据后立即进行关联查询或其他操作。 以下是一个使用 `SCOPE_IDENTITY()` 获取最新插入记录标识SQL 示例: ```sql -- 假设有一个名为 tb_User 的表,其中包含自增主键列 id INSERT INTO tb_User (name, email) VALUES ('张三', 'zhangsan@example.com'); -- 获取刚刚插入记录的标识 SELECT SCOPE_IDENTITY() AS LastInsertedId; ``` 在实际应用中,尤其是在使用某些 ORM 框架(如 MyBatis)时,需要注意 `SCOPE_IDENTITY()` 的使用方式。由于这些框架可能会将 `INSERT` `SELECT SCOPE_IDENTITY()` 操作分开执行,导致两者不在同一个作用域内,从而导致 `SCOPE_IDENTITY()` 返回 `NULL`。为了解决这个问题,可以考虑将 `INSERT` 操作获取标识的操作封装在一个存储过程中,确保它们在同一作用域内执行。 此外,对于不同的数据库管理系统,获取最新插入记录标识的方式可能有所不同。例如,在 MySQL 中,可以使用 `LAST_INSERT_ID()` 函数来实现类似的功能。 ### 示例代码(SQL Server 存储过程): ```sql CREATE PROCEDURE InsertUserAndGetId @Name NVARCHAR(100), @Email NVARCHAR(100), @NewId INT OUTPUT AS BEGIN INSERT INTO tb_User (name, email) VALUES (@Name, @Email); SET @NewId = SCOPE_IDENTITY(); END; ``` 通过这种方式,可以确保 `SCOPE_IDENTITY()` 能够正确返回最新插入记录的标识,即使在复杂的业务逻辑中也能可靠地获取到所需的主键信息。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值