@@identity , SCOPE_IDENTITY,IDENT_CURRENT 三者的异同

简介: --===================================================== --@@identity , SCOPE_IDENTITY,IDENT_CURRENT 三者的异同 --===================================================== --1.

--=====================================================
--@@identity , SCOPE_IDENTITY,IDENT_CURRENT 三者的异同
--=====================================================
--1.@@IDENTITY:  返回最后插入的标识值
IF OBJECT_ID('dbo.ta') IS NOT NULL
   DROP TABLE dbo.ta;
CREATE TABLE dbo.ta
(
 ID INT IDENTITY PRIMARY KEY ,
 Col VARCHAR(5)
);
INSERT INTO ta SELECT 'A'
INSERT INTO ta SELECT 'B'
INSERT INTO ta SELECT 'C'
SELECT @@IDENTITY AS Iden   

--Result :
Iden
--------------
3

IF OBJECT_ID('dbo.tb') IS NOT NULL
   DROP TABLE dbo.tb;
CREATE TABLE dbo.tb
(
 tb_id INT IDENTITY PRIMARY KEY ,
 tb_col VARCHAR(5)
);

--当触发器存在时, 返回被触发的表Identity列的值,不考虑任何作用域
IF OBJECT_ID('dbo.tr_ta') IS NOT NULL
   DROP TRIGGER dbo.tr_ta
   GO
CREATE TRIGGER tr_ta
ON dbo.ta
FOR INSERT
AS
BEGIN
    INSERT INTO tb SELECT 'AA'
END

INSERT INTO ta SELECT 'D'
INSERT INTO ta SELECT 'E'
SELECT @@IDENTITY AS Iden  --返回tb表中Identity列的值为2

--Result :
Iden
--------
2

--2.SCOPE_IDENTITY:返回当前作用域中的标识列内的最后一个标识值

INSERT INTO ta SELECT 'F'
SELECT @@IDENTITY AS [Identity];
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];

--Result:返回tb表中最后的Identity为3,当前作用域中最后的Identity为6,即表ta中最后的Identity为6
Identity
---------
3

(1 row(s) affected)

SCOPE_IDENTITY
----------
6

(1 row(s) affected)


--3.IDEN_CURRENT 返回指定的表或视图生成的最后一个标识值
INSERT INTO dbo.ta SELECT 'G'
SELECT @@IDENTITY AS [Identity];
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];
SELECT IDENT_CURRENT('ta') AS [IDENT_CURRENT_ta];
SELECT IDENT_CURRENT('tb') AS [IDENT_CURRENT_tb];


--Result:
Identity
--------------
4

(1 row(s) affected)

SCOPE_IDENTITY
--------------
7

(1 row(s) affected)

IDENT_CURRENT_ta
--------------
7

(1 row(s) affected)

IDENT_CURRENT_tb
--------------
4

--打开新的一个会话,不执行任何插入,如下:
SELECT @@IDENTITY AS [Identity];
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];
SELECT IDENT_CURRENT('ta') AS [IDENT_CURRENT_ta];
SELECT IDENT_CURRENT('tb') AS [IDENT_CURRENT_tb];

--Result:
Identity
---------------------------------------
NULL

(1 row(s) affected)

SCOPE_IDENTITY
---------------------------------------
NULL

(1 row(s) affected)

IDENT_CURRENT_ta
---------------------------------------
7

(1 row(s) affected)

IDENT_CURRENT_tb
---------------------------------------
4

总结:
共同点:三者都返回最后生成的标识值
不同点:各个函数的因作用域或会话的不同而返回不同的结果。
● @@IDENTITY 返回为跨所有作用域的当前会话中的某个表生成的最新标识值。
● SCOPE_IDENTITY 返回为当前会话和当前作用域中的某个表生成的最新标识值。
● IDENT_CURRENT 返回为某个会话和或作用域中的指定表生成的最新标识值。

目录
相关文章
ABAP 数据结构激活时的错误消息 - combination reference table field XXX does not exist
ABAP 数据结构激活时的错误消息 - combination reference table field XXX does not exist
ABAP 数据结构激活时的错误消息 - combination reference table field XXX does not exist
Quaternion.identity是什么意思?
Quaternion.identity就是指Quaternion(0,0,0,0),
|
数据库 Java 数据库连接
identity和assigned 的区别
在使用struts+hibernate开发过程中,数据的持久化操作时出现了“org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): ”的错误,首先检查了数据库,发现建表时没有把ID设置成自动递增,修改之后还是有错误,
1440 0
AutoMapper:Unmapped members were found. Review the types and members below. Add a custom mapping expression, ignore, add a custom resolver, or modify
异常处理汇总-后端系列 http://www.cnblogs.com/dunitian/p/4523006.html 应用场景:ViewModel==>Mode映射的时候出错 AutoMappe r错误信息:Unmapped members were found.
1246 0
|
SQL 数据库管理 关系型数据库
SP2-0618: Cannot find the Session Identifier. Check PLUSTRACE role is enabled
测试环境:OEL6.5+Oracle 11g R2在进行执行计划测试的时候,遇到一个小问题。在用普通用户执行下面这条命令的时候,普通用户名为hhu,已经赋予了create session和resource权限。
1105 1