@@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. 【maven】maven项目移除Maven Dependencies后如何再添加进去

    比较着急这几天弄一个项目,所以匆忙间把maven项目的Maven Dependencies给remove掉了 如下图: 这下可好,整个项目报错了 解决方法: 对比了有Maven Dependencie ...

  2. windows 线程同步

    Windows 临界区,内核事件,互斥量,信号量. 临界区,内核事件,互斥量,信号量,都能完成线程的同步,在这里把他们各自的函数调用,结构定义,以及适用情况做一个总结. 临界区: 适用范围:它只能同步 ...

  3. CSS -- 文字竖直居中

    元素的height 和 lineheight 设置为一样即可.

  4. LaTex:图片排版

    一般支持三种格式的图片排版 %% if you use PostScript figures in your article %% use the graphics package for simpl ...

  5. html之marquee会移动的文字

    该标签不是HTML3.2的一部分,并且只支持MSIE3以后内核,所以如果你使用非IE内核浏览器(如:Netscape)可能无法看到下面一些很有意思的效果 该标签是个容器标签 语法: <marqu ...

  6. [转]SSIS ProtectionLevel 对包中敏感数据的访问控制

    本文转自:http://technet.microsoft.com/zh-cn/library/ms141747.aspx 为了保护 Integration Services 包中的数据,可以设置保护 ...

  7. github之无命令可视化界面操作——GitHub DeskTop

    Git是Linuxs之父Lunus用C语言写的一个非常好用的分布式版本控制系统. GitHub可以给我们提供免费的代码仓库,并用Git可以在上面提交代码并进行版本控制.使用Git一般要安装Git ,并 ...

  8. Java实现Redis pipeline比较

    开始实验这个,是因为Redis实战.pdf上面有例子. 上面用的是 org.jredis包,可是发现这个包不在maven的公共仓库里.需要先下载然后放在本地,导入maven依赖.详见: http:// ...

  9. Index 和 Type 的区别

    原文: Index vs. Type By Adrien Grand 译者: fengchang 对于 ES 的新用户来说,有一个常见的问题:要存储一批新的数据时,应该在已有 index 里新建一个 ...

  10. 如何在asp.net mvc框架及django框架下面避免CSRF

    CSRF 跨站伪造请求 不知CSRF为何物的,可以问下G哥. 在Asp.net MVC平台下,提供了Html.AntiForgeryToken() 方法,我们只需把其放在form的标签内,在浏览器端就 ...