zoukankan      html  css  js  c++  java
  • 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


    作者:水木    
     
  • 相关阅读:
    css点滴3—5种方式实现圆环
    css点滴2—六种方式实现元素水平居中
    css点滴1—八种方式实现元素垂直居中
    当我们在讨论CQRS时,我们在讨论些神马?
    CSDN屏蔽广告
    手撸一套纯粹的CQRS实现
    【转】CAP 定理的含义
    【转】浅谈命令查询职责分离(CQRS)模式
    Castle DynamicProxy基本用法(AOP)
    【转】面向对象设计的SOLID原则
  • 原文地址:https://www.cnblogs.com/hsapphire/p/1669889.html
Copyright © 2011-2022 走看看