@@identity , SCOPE_IDENTITY,IDENT_CURRENT 三者异同_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2633 | 回复: 0   主题: @@identity , SCOPE_IDENTITY,IDENT_CURRENT 三者异同        下一篇 
3
注册用户
等级:少尉
经验:356
发帖:6
精华:0
注册:2012-11-23
状态:离线
发送短消息息给3 加好友    发送短消息息给3 发消息
发表于: IP:您无权察看 2015-7-20 15:19:17 | [全部帖] [楼主帖] 楼主

--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 返回为某个会话和或作用域中的指定表生成的最新标识值。

--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论