[SQL]select scope_identity()传回插入相同范围之识别资料行中的最后一个识别值
传回插入相同范围之识别资料行中的最后一个识别值。范围是一个模组:预存程序、触发程序、函数或批次。因此,如果两个陈述式在相同预存程序、函数或批次中,它们就在相同范围中。
语法:
SCOPE_IDENTITY()
传回类型:
numeric
备注:
SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY 是类似的函数,因为它们会传回插入识别资料行的值。
IDENT_CURRENT 不受范围和工作阶段的限制;它只限于指定的资料表。IDENT_CURRENT 会传回在任何工作阶段和任何范围中,产生给特定资料表的值。如需详细资讯,请参阅<IDENT_CURRENT (Transact-SQL)>。
SCOPE_IDENTITY 和 @@IDENTITY 会传回目前工作阶段任何资料表中所产生的最後一个识别值。不过,SCOPE_IDENTITY 会传回只在目前范围内插入的值;@@IDENTITY 不限于特定范围。
例如,有 T1 和 T2 两份资料表,T1 定义了 INSERT 触发程序。当资料列插入 T1 时,会引发触发程序,且会在 T2 中插入一个资料列。这个状况说明两个范围:在 T1 插入,以及触发程序在 T2 插入。
假设 T1 和 T2 都有识别资料行,在 T1 的 INSERT 陈述式结束时,@@IDENTITY 和 SCOPE_IDENTITY 会传回不同的值。@@IDENTITY 会传回在目前工作阶段中,跨越任何范围所插入的最後一个识别资料行值。这是在 T2 中插入的值。SCOPE_IDENTITY() 会传回在 T1 中插入的 IDENTITY 值。这是相同范围内所发生的最後一项插入。如果在范围内的识别资料行执行任何 INSERT 陈述式之前叫用 SCOPE_IDENTITY() 函数,这个函数会传回 Null 值。
失败的陈述式和交易可能会变更资料表的目前识别,以及建立识别资料行值中的间距。识别值永远不会回复,即使试图将值插入资料表的交易未获认可,也是如此。例如,如果 INSERT 陈述式因 IGNORE_DUP_KEY 违规而失败,资料表的目前识别值仍会递增。
范例:
A. 使用 @@IDENTITY 和 SCOPE_IDENTITY 搭配触发程序
下列范例会建立 TZ 和 TY 这两份资料表,以及 TZ 的 INSERT 触发程序。当资料列插入 TZ 资料表时,会引发触发程序 (Ztrig),且会在 TY 中插入一个资料列。
USE tempdb
GO
CREATE TABLE TZ (
Z_id int IDENTITY(,)PRIMARY KEY,
Z_name varchar() 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
-------------
Lisa
Mike
Carla
CREATE TABLE TY (
Y_id int IDENTITY(,)PRIMARY KEY,
Y_name varchar() 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
---------------
boathouse
rocks
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 /*SCOPE_IDENTITY returned the last identity value in the same scope. This was the insert on table TZ.*/
@@IDENTITY /*@@IDENTITY returned the last identity value inserted to TY by the trigger. This fired because of an earlier insert on TZ.*/
B. 使用 @@IDENTITY 和 SCOPE_IDENTITY() 搭配复写
下列范例会说明如何针对为了合并式复写而发行之资料库的插入,使用 @@IDENTITY 和 SCOPE_IDENTITY()。范例中的两份资料表都位於 AdventureWorks 范例资料库中:Person.ContactType 尚未发行,而 Sales.Customer 已发行。合并式复写会将触发程序加入至发行的资料表。因此,@@IDENTITY 可能会根据复写系统资料表的插入 (而非使用者资料表的插入) 传回值。
Person.ContactType 资料表具有最大识别值 。如果您将资料列插入此资料表,@@IDENTITY 和 SCOPE_IDENTITY() 就会传回相同的值。
USE AdventureWorks;
GO
INSERT INTO Person.ContactType ([Name]) VALUES ('Assistant to the Manager')
GO
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
GO
SELECT @@IDENTITY AS [@@IDENTITY]
GO
以下为结果集:
SCOPE_IDENTITY @@IDENTITY Sales.Customer 资料表具有最大识别值 。如果您将资料列插入此资料表,@@IDENTITY 和 SCOPE_IDENTITY() 就会传回不同的值。SCOPE_IDENTITY() 会根据使用者资料表的插入传回值,而 @@IDENTITY 会根据复写系统资料表的插入传回值。您可以针对需要存取已插入识别值的应用程式,使用 SCOPE_IDENTITY()。
INSERT INTO Sales.Customer ([TerritoryID],[CustomerType]) VALUES (,'S')
GO
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
GO
SELECT @@IDENTITY AS [@@IDENTITY]
GO
以下为结果集:
SCOPE_IDENTITY @@IDENTITY
[SQL]select scope_identity()传回插入相同范围之识别资料行中的最后一个识别值的更多相关文章
- mysql中如何在命令行中,执行一个SQL脚本文件?
需求描述: 在mysql数据库的使用中,有的时候,需要直接在shell的命令行中,执行某个SQL脚本文件, 比如,要初始化数据库,创建特定的存储过程,创建表等操作,这里进行一个基本的测试. 一般情况, ...
- <转>SQL Server返回最后一个标识值的三个函数:IDENT_CURRENT、@@IDENTITY、SCOPE_IDENTITY
MSDN对官方解释:这三个函数都返回最后生成的标识值. 但是,上述每个函数中定义的“最后”的作用域和会话有所不同. 1.IDENT_CURRENT 返回为某个会话和当前作用域中的指定表生成的最新标识值 ...
- 09Microsoft SQL Server 表数据插入,更新,删除
Microsoft SQL Server 表数据插入,更新,删除 向表中插入数据 INSERT INTO insert into tb1 values(0004,'张凤凤') insert into ...
- Sql Insert into select 创建临时表插入自增列
] GO ============================================= -- Author: PPL -- Create date: 2015-11-23 -- Desc ...
- SQL查询 [SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY的区别(比较)] ---转载
@@IDENTITY (Transact-SQL) 返回最后插入的标识值的系统函数. 备注 在一条 INSERT.SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含语句生成的 ...
- SQL UNION 和 UNION ALL 操作符\SQL SELECT INTO 语句\SQL CREATE DATABASE 语句
SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每 ...
- SQL SELECT INTO使用
SQL SELECT INTO 语句可用于创建表的备份复件. SELECT INTO 语句 SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中. SELECT INTO 语句常用 ...
- SQL SELECT 语句
本章讲解 SELECT 和 SELECT * 语句. SQL SELECT 语句 SELECT 语句用于从表中选取数据. 结果被存储在一个结果表中(称为结果集). SQL SELECT 语法 SE ...
- select into from 和 insert into select 的区别和用法及 SQL SELECT INTO 中Undeclared variable错误解决办法
今天试了一下数据表中的数据备份到另一个空的数据表,然后使用了SQL SELECT INTO语句,然后提示Undeclared variable......错误,现在在这里做下总结并给出解决办法. 应用 ...
随机推荐
- sublime个人快捷键
ctrl+alt+f = 代码格式化(html,js) ctrl+d = 选中相同内容 alt+shift+w = 为内容添加新标签 ctrl+shift+a = 选择标签内的内容(再按一 ...
- 无法在web服务器上启动调试。Microsoft Visual Studio 远程调试监视器(MSVSMON.EXE)似乎没有在远程计算机上运行,VS2012调试错误
1.重启(无用) 2.关闭防火墙(无用) 3.开启文件与打印机共享(无用) 4.无远程调试权限,改为本地调试.或者是IIS中此项目没有启动.或者没有在IIS中新建此项目.
- Apache 性能优化
有一个升级服务器,这几天一直访问的比较慢.导致部分用户升级不了.看了一下服务器的负载,发现 CPU和内存占用的都不是很高,可能是Apache配置不当造成的,一番搜索,找到了MPM的配置,提速很明显哦 ...
- weblogic性能调优参考
1.weblogic内存的调优 2.weblogic性能调优 各个方面比较全内容较多 3.记录一次weblogic 11g压力测试性能调优过程 经调优后,具体java启动参数如下: /app/webl ...
- 删除文件夹工具类 DeleteFolder.java
package com.util; import java.io.File; /** * 删除文件夹 * @createTime DSC 20, 2010 15:38 * @version 2.0 * ...
- C#文本文件(.txt)读写
目录 前言 读取txt文件 写入txt文件 前言 计算机在最初只支持ASCII编码,但是后来为了支持其他语言中的字符(比如汉字)以及一些特殊字符(比如€),就引入了Unicode字符集.基于Unico ...
- WCF学习心得------(七)消息协定
第七章 消息协定 7.1 消息协定概述 通常情况下,在定义消息的架构时只使用数据协定就足够,但是有时需要精确控制如何将类型映射到通过网络传输的SOAP消息.对于这种情况,通常解决方案是插入自定义的SO ...
- MS CRM 2011的自定义和开发(11)——插件(plugin)开发(二)
http://www.cnblogs.com/StoneGarden/archive/2012/02/06/2339490.html MS CRM 2011的自定义和开发(11)——插件(plugin ...
- 开始学习IOS
最好的学习方式就是动手. 对于有编程经验的程序员来说,学习另外一门技术最好的方式就是coding,虽然基础知识和IDE都不熟悉,但是在写代码的过程中,不断的解决问题,不断查找资料,不断感悟代码,一切都 ...
- github 添加 C# IGNORE
在创建仓库时选择 VisualStudio 即可.