@@IDENTITY 和SCOPE_IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值。但是,SCOPE_IDENTITY 只返回插入到当前作用域中的值;@@IDENTITY 不受限于特定的作用域。

例如,有两个表 T1 和 T2,并且在 T1 上定义了 INSERT 触发器。当将某行插入 T1 时,触发器被激发,并在 T2 中插入一行。 该方案演示了两个作用域:在 T1 上的插入,以及在 T2 通过触发器的插入。

假设 T1 和 T2 都有标识列,@@IDENTITY 和 SCOPE_IDENTITY 将在 T1 上的 INSERT 语句的最后返回不同的值。@@IDENTITY 将返回在当前会话中的任何作用域内插入的最后一个标识列的值。这是在 T2 中插入的值。SCOPE_IDENTITY() 将返回在 T1 中插入的 IDENTITY 值。这是在同一个作用域内发生的最后的插入。如果在任何 INSERT 语句作用于作用域中的标识列之前调用 SCOPE_IDENTITY() 函数,则该函数将返回空值。

如果语句和事务失败,它们会更改表的当前标识,从而使标识列中的值出现不连贯现象。即使未提交试图向表中插入值的事务,也永远无法回滚标识值。例如,如果因 IGNORE_DUP_KEY 冲突而导致 INSERT 语句失败,表的当前标识值仍然会增加。

以下示列创建两个表,TZTY,并在 TZ 中创建一个 INSERT 触发器。当将某行插入表 TZ 中时,触发器 (Ztrig) 将激发并在 TY 中插入一行。

USE tempdb
GO
CREATE TABLE TZ (
Z_id int IDENTITY(1,1)PRIMARY KEY,
Z_name varchar(20) NOT NULL) INSERT TZ
VALUES ('Lisa')
INSERT TZ
VALUES ('Mike')
INSERT TZ
VALUES ('Carla') SELECT * FROM TZ --Result set: This is how table TZ looks.
Z_id Z_name
-------------
1 Lisa
2 Mike
3 Carla CREATE TABLE TY (
Y_id int IDENTITY(100,5)PRIMARY KEY,
Y_name varchar(20) NULL) INSERT TY (Y_name)
VALUES ('boathouse')
INSERT TY (Y_name)
VALUES ('rocks')
INSERT TY (Y_name)
VALUES ('elevator') SELECT * FROM TY
--Result set: This is how TY looks:
Y_id Y_name
---------------
100 boathouse
105 rocks
110 elevator /*Create the trigger that inserts a row in table TY
when a row is inserted in table TZ*/
CREATE TRIGGER Ztrig
ON TZ
FOR INSERT AS
BEGIN
INSERT TY VALUES ('')
END /*FIRE the trigger and determine what identity values you obtain
with the @@IDENTITY and SCOPE_IDENTITY functions.*/
INSERT TZ VALUES ('Rosalie') SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
GO
SELECT @@IDENTITY AS [@@IDENTITY]
GO
 
下面是结果集:
SCOPE_IDENTITY
4
/*SCOPE_IDENTITY returned the last identity value in the same scope. This was the insert on table TZ.*/ @@IDENTITY
115
/*@@IDENTITY returned the last identity value inserted to TY by the trigger. This fired because of an earlier insert on TZ.*/ http://www.cnblogs.com/MingDe/archive/2011/10/12/2208749.html
USE [tempdb]
GO CREATE TABLE [dbo].[MainTB](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](50) NULL,
CONSTRAINT [PK_MainTB] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] GO CREATE TABLE [dbo].[SubTB](
[Id] [int] IDENTITY(100,5) NOT NULL,
[Memo] [nvarchar](50) NULL,
[MainKeyId] [int] NOT NULL,
CONSTRAINT [PK_SubTB] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] GO ALTER TABLE [dbo].[SubTB] WITH CHECK ADD CONSTRAINT [FK_SubTB_MainTB] FOREIGN KEY([MainKeyId])
REFERENCES [dbo].[MainTB] ([Id])
GO ALTER TABLE [dbo].[SubTB] CHECK CONSTRAINT [FK_SubTB_MainTB]
GO ---------------------------------------------------- INSERT INTO dbo.MainTB(Name)
SELECT '張三' SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
SELECT @@IDENTITY AS [@@IDENTITY]
SELECT IDENT_CURRENT('MainTB')
SELECT IDENT_CURRENT('SubTB') ---------------------------------------------------- INSERT INTO dbo.MainTB(Name)
SELECT '李四'
UNION ALL
SELECT '王五' SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
SELECT @@IDENTITY AS [@@IDENTITY]
SELECT IDENT_CURRENT('MainTB')
SELECT IDENT_CURRENT('SubTB') ---------------------------------------------------- INSERT INTO dbo.MainTB(Name)
SELECT '李四'
UNION ALL
SELECT '王五' INSERT INTO dbo.SubTB(Memo)
SELECT '備註一'
UNION ALL
SELECT '備註二' SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
SELECT @@IDENTITY AS [@@IDENTITY]
SELECT IDENT_CURRENT('MainTB')
SELECT IDENT_CURRENT('SubTB') -----------------------------------------------------------
INSERT INTO dbo.MainTB(Name)
SELECT '李四'
UNION ALL
SELECT '王五' INSERT INTO dbo.SubTB(Memo,MainKeyId)
SELECT '備註一',1
UNION ALL
SELECT '備註二',1 SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
SELECT @@IDENTITY AS [@@IDENTITY]
SELECT IDENT_CURRENT('MainTB')
SELECT IDENT_CURRENT('SubTB')
-----------------------------------------------------------
CREATE TRIGGER trgTEST
ON MainTB
FOR INSERT AS
BEGIN
INSERT INTO dbo.SubTB(Memo,MainKeyId) SELECT '備註一',SCOPE_IDENTITY()
END INSERT INTO dbo.MainTB(Name)
SELECT '李四' SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
SELECT @@IDENTITY AS [@@IDENTITY]
SELECT IDENT_CURRENT('MainTB')
SELECT IDENT_CURRENT('SubTB')
------------------------------------------------------ INSERT INTO dbo.MainTB(Name)
SELECT '李四'
WAITFOR DELAY '00:00:20'
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
SELECT @@IDENTITY AS [@@IDENTITY]
SELECT IDENT_CURRENT('MainTB')
SELECT IDENT_CURRENT('SubTB')
SELECT * FROM dbo.MainTB
SELECT * FROM dbo.SubTB --新开查询窗同时执行以下Script
INSERT INTO dbo.MainTB(Name)
SELECT '李四'
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
SELECT @@IDENTITY AS [@@IDENTITY]
SELECT IDENT_CURRENT('MainTB')
SELECT IDENT_CURRENT('SubTB')
SELECT * FROM dbo.MainTB
SELECT * FROM dbo.SubTB

IDENT_CURRENT('MainTB'):取表的最后编号,注意如果在高并发下,可能会取的不是预期的结果。

@@identity、scope_identity()、IDENT_CURRENT('tablename')函数的区别的更多相关文章

  1. 糟糕的@@identity,SCOPE_IDENTITY ,IDENT_CURRENT

    在某数据库里面,某甲用@@identity来获取最近插入的id值,当在多人环境,发生获取到null值的问题. 那么@@identity是否有存在的必要? 感觉像生个孩子,多了个指头. 有的数据库的ge ...

  2. IDENT_CURRENT ,@@identity,SCOPE_IDENTITY() 之间对比

    获取表的标识值,有3种比较常见的用法 IDENT_CURRENT ,@@identity,SCOPE_IDENTITY(),有啥不一样呢? 3个关键字在联机手册中的解释   IDENT_CURRENT ...

  3. SQL表值函数和标量值函数的区别

    SQL表值函数和标量值函数的区别 写sql存储过程经常需要调用一些函数来使处理过程更加合理,也可以使函数复用性更强,不过在写sql函数的时候可能会发现,有些函数是在表值函数下写的有些是在标量值下写的, ...

  4. .NET重构(五):存储过程、触发器和函数的区别

    导读:在触发器的学习过程中,师傅讲了它的耦合性高,建议我能用存储过程,那到底什么是存储过程呢,自己也不是特别了解,还有就是,触发器也算是一种特殊的存储过程,为什么就不建议多用呢?接下来,就谈谈触发器. ...

  5. PHP中fopen,file_get_contents,curl函数的区别

    PHP中fopen,file_get_contents,curl函数的区别 1.fopen/file_get_contents每次请求都做DNS查询,并不对DNS的信息进行缓存,而curl会对DNS的 ...

  6. php正规则表达式学习笔记(几个常用函数的区别)

    preg_mache()函数和 preg_mache_all()函数的区别: preg_mache()只会匹配规则中的字符一次, preg_mache_all()会匹配符合条件的所有字符! 例子对比: ...

  7. exit()与_exit()函数的区别(Linux系统中)

    注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXI ...

  8. fork 函数 和vfork 函数的区别

    问题描述:         fork 函数 和vfork 函数的区别 问题解决: fork函数使用: 注:         以上printf 属于标准IO库带缓冲,如果标准输出链接到终端设备,则它是行 ...

  9. sql - sum() 和 count() 函数的区别

    对sql一直都是蜻蜓点水,突然也觉得对这两个函数的区别有点朦胧,查了一下,在这里说一下: sum():主要用于累加求和. count():主要用于行(记录)的统计.

随机推荐

  1. ArcGIS 10.2 三维分析工具箱部分工具不能用

    如在以下面的方式操作时发现弹出错误提示, “ Unable to execute the selected tool”... 问题解决方法为: 点击Extensions...,然后把下图中的选项全部勾 ...

  2. AppCan入门教程

    主干 主干可以认为是整个页面的整体框架布局 上图是截取与ZAKER(原生开发).正益无线(HTML5开发).ZAKER微博界面(原生开发)和HTML5中国(HTML5开发).参考上述界面我们看到大部分 ...

  3. JIRA Service Desk 3.9.2 没有许可证

    https://my.atlassian.com/license/evaluation Server ID BFHT-0XFL-3NM8-3KRF SEN SEN-L10880225 License ...

  4. 【spring colud】spring cloud微服务项目搭建【spring boot2.0】

    spring cloud微服务项目搭建 =================================== 示例版本: 1.spring boot 2.0版本 2.开发工具 IntellJ IDE ...

  5. 云计算与OpenStack(虚拟机Nova篇)

    <云计算与OpenStack(虚拟机Nova篇)> 基本信息 作者: 伯龙 程志鹏 张杰 出版社:电子工业出版社 ISBN:9787121201202 上架时间:2013-8-5 出版日期 ...

  6. 三种主流的Web服务实现方案(REST+SOAP+XML-RPC)简述及比较

    目前知道的三种主流的Web服务实现方案为:REST:表象化状态转变 (软件架构风格)SOAP:简单对象访问协议 XML-RPC:远程过程调用协议 下面分别作简单介绍: REST:表征状态转移(Repr ...

  7. select标签中的选项分组

    select标签中的选项分组 <select name="showtimes"> <optgroup label="下午一点"> < ...

  8. 百度编辑器上传大视频报http请求错误怎么办

    百度编辑器UEditor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码,所以受到很多开放人员的青睐.但是有时 ...

  9. Android之旅七 Service简介

    1.          Service是什么:它是一个应用程序组件.没有图形化界面.通常用来处理一些耗时比较长的操作(例如下载.播放MP3等等).可以使用Service更新ContentProvide ...

  10. 【java】Could not find or load main class

    https://stackoverflow.com/questions/18093928/what-does-could-not-find-or-load-main-class-mean A comm ...