`
pcajax
  • 浏览: 2109659 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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(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.*/

B. 使用 @@IDENTITY 和 SCOPE_IDENTITY() 搭配复写

下列范例会说明如何针对为了合并式复写而发行之资料库的插入,使用 @@IDENTITY 和 SCOPE_IDENTITY()。范例中的两份资料表都位於 AdventureWorks 范例资料库中:Person.ContactType 尚未发行,而 Sales.Customer 已发行。合并式复写会将触发程序加入至发行的资料表。因此,@@IDENTITY 可能会根据复写系统资料表的插入 (而非使用者资料表的插入) 传回值。

Person.ContactType 资料表具有最大识别值 20。如果您将资料列插入此资料表,@@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

21

@@IDENTITY

21

Sales.Customer 资料表具有最大识别值 29483。如果您将资料列插入此资料表,@@IDENTITY 和 SCOPE_IDENTITY() 就会传回不同的值。SCOPE_IDENTITY() 会根据使用者资料表的插入传回值,而 @@IDENTITY 会根据复写系统资料表的插入传回值。您可以针对需要存取已插入识别值的应用程式,使用 SCOPE_IDENTITY()。

INSERT INTO Sales.Customer ([TerritoryID],[CustomerType]) VALUES (8,'S')

GO

SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]

GO

SELECT @@IDENTITY AS [@@IDENTITY]

GO

以下为结果集:

SCOPE_IDENTITY

24984

@@IDENTITY

分享到:
评论

相关推荐

    sql语句返回主键SCOPE_IDENTITY()

    在sql语句后使用 SCOPE_IDENTITY() 当然您也可以使用 SELECT @@IDENTITY 但是使用 SELECT @@IDENTITY是去全局最新. 有可能取得值不正确. 示例: 代码如下:insert into dbo.SNS_BlogData(userName) values(‘jiangyun...

    @@IDENTITY与SCOPE_IDENTITY()

    在一条 INSERT、SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含语句生成的最后一个标识值

    向数据库中插入数据并返回当前插入的行数及全局变量@@IDENTITY应用

    利用存储过程实现插入时返回当前的行数 代码如下: CREATE PROC Proc_InsertUser @name nvarchar(100) AS INSERT INTO dbo.User( Name )VALUES(@name) SELECT @@IDENTITY AS ID 利用全局变量@@IDENTITY实现。...

    Hibernate注释大全收藏

    The next example shows the definition of a sequence generator in a class scope: @Entity @javax.persistence.SequenceGenerator( name="SEQ_STORE", sequenceName="my_sequence" ) public class Store ...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    11.1.3. 关注对象标识(Considering object identity) 11.1.4. 常见问题 11.2. 数据库事务声明 11.2.1. 非托管环境 11.2.2. 使用JTA 11.2.3. 异常处理 11.2.4. 事务超时 11.3. 乐观并发控制(Optimistic ...

    ICS delphixe10源码版

    ICS - Internet Component Suite - V8 - ...Uninstall an existing ICS package (Menu | Component | Install Packages, select the component package and click Remove). Rename the old ICS directory and unzip to...

    Hibernate参考文档

    11.1. Session和事务范围(transaction scope) 11.1.1. 操作单元(Unit of work) 11.1.2. 长对话 11.1.3. 关注对象标识(Considering object identity) 11.1.4. 常见问题 11.2. 数据库事务声明 11.2.1. 非托管环境 ...

    hibernate 体系结构与配置 参考文档(html)

    Session和事务范围(transaction scope) 11.1.1. 操作单元(Unit of work) 11.1.2. 长对话 11.1.3. 关注对象标识(Considering object identity) 11.1.4. 常见问题 11.2. 数据库事务声明 11.2.1. 非托管环境 ...

    Hibernate 中文 html 帮助文档

    11.1. Session和事务范围(transaction scope) 11.1.1. 操作单元(Unit of work) 11.1.2. 长对话 11.1.3. 关注对象标识(Considering object identity) 11.1.4. 常见问题 11.2. 数据库事务声明 11.2.1. 非托管环境 ...

    Hibernate中文详细学习文档

    11.1.3. 关注对象标识(Considering object identity) 11.1.4. 常见问题 11.2. 数据库事务声明 11.2.1. 非托管环境 11.2.2. 使用JTA 11.2.3. 异常处理 11.2.4. 事务超时 11.3. 乐观并发控制(Optimistic ...

    Hibernate+中文文档

    11.1.3. 关注对象标识(Considering object identity) 11.1.4. 常见问题 11.2. 数据库事务声明 11.2.1. 非托管环境 11.2.2. 使用JTA 11.2.3. 异常处理 11.2.4. 事务超时 11.3. 乐观并发控制(Optimistic ...

    HibernateAPI中文版.chm

    11.1.3. 关注对象标识(Considering object identity) 11.1.4. 常见问题 11.2. 数据库事务声明 11.2.1. 非托管环境 11.2.2. 使用JTA 11.2.3. 异常处理 11.2.4. 事务超时 11.3. 乐观并发控制(Optimistic ...

    hibernate3.2中文文档(chm格式)

    11.1.3. 关注对象标识(Considering object identity) 11.1.4. 常见问题 11.2. 数据库事务声明 11.2.1. 非托管环境 11.2.2. 使用JTA 11.2.3. 异常处理 11.2.4. 事务超时 11.3. 乐观并发控制(Optimistic ...

Global site tag (gtag.js) - Google Analytics