`
冷寒冰
  • 浏览: 249071 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SCOPE_IDENTITY和@@IDENTITY的用法

 
阅读更多
SCOPE_IDENTITY和@@IDENTITY的用法SCOPE_IDENTITY和@@IDENTITY的用法

SCOPE_IDENTITY
返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值。一个作用域就是一个模块——存储过程、触发器、函数或批处理。因此,如果两个语句处于同一个存储过程、函数或批处理中,则它们位于相同的作用域中。

语法
SCOPE_IDENTITY( )

返回类型
sql_variant

注释
SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY 在功能上相似,因为它们都返回插入到 IDENTITY 列中的值。

IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回为任何会话和作用域中的特定表所生成的值。有关更多信息,请参见 IDENT_CURRENT。

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

例如,有两个表 T1 和 T2,在 T1 上定义了一个 INSERT 触发器。当将某行插入 T1 时,触发器被激发,并在 T2 中插入一行。此例说明了两个作用域:一个是在 T1 上的插入,另一个是作为触发器的结果在 T2 上的插入。

假设 T1 和 T2 都有 IDENTITY 列,@@IDENTITY 和 SCOPE_IDENTITY 将在 T1 上的 INSERT 语句的最后返回不同的值。

@@IDENTITY 返回插入到当前会话中任何作用域内的最后一个 IDENTITY 列值,该值是插入 T2 中的值。

SCOPE_IDENTITY() 返回插入 T1 中的 IDENTITY 值,该值是发生在相同作用域中的最后一个 INSERT。如果在作用域中发生插入语句到标识列之前唤醒调用 SCOPE_IDENTITY() 函数,则该函数将返回 NULL 值。

有关说明,请参见示例。

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


1 USE tempdb
2 GO
3 CREATE TABLE TZ (
4     Z_id  int IDENTITY(1,1)PRIMARY KEY,
5     Z_name varchar(20) NOT NULL)
6
7 INSERT TZ
8    VALUES ('Lisa')
9 INSERT TZ
10    VALUES ('Mike')
11 INSERT TZ
12    VALUES ('Carla')
13
14 SELECT * FROM TZ
15
16 --Result set: This is how table TZ looks
17 Z_id    Z_name
18 -------------
19 1       Lisa
20 2       Mike
21 3       Carla
22
23 CREATE TABLE TY (
24     Y_id  int IDENTITY(100,5)PRIMARY KEY,
25     Y_name varchar(20) NULL)
26
27 INSERT TY (Y_name)
28    VALUES ('boathouse')
29 INSERT TY (Y_name)
30    VALUES ('rocks')
31 INSERT TY (Y_name)
32    VALUES ('elevator')
33
34 SELECT * FROM TY
35 --Result set: This is how TY looks:
36 Y_id   Y_name
37 ---------------
38 100    boathouse
39 105    rocks
40 110    elevator
41
42 /*Create the trigger that inserts a row in table TY
43 when a row is inserted in table TZ*/
44 CREATE TRIGGER Ztrig
45 ON TZ
46 FOR INSERT AS
47    BEGIN
48    INSERT TY VALUES ('')
49    END
50
51 /*FIRE the trigger and find out what identity values you get
52 with the @@IDENTITY and SCOPE_IDENTITY functions*/
53 INSERT TZ VALUES ('Rosalie')
54
55 SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
56 GO
57 SELECT   @@IDENTITY AS [@@IDENTITY]
58 GO
59
60 --Here is the result set.
61 SCOPE_IDENTITY
62 4
63 /*SCOPE_IDENTITY returned the last identity value in the same scope, which was the insert on table TZ*/
64
65 @@IDENTITY
66 115
67 /*@@IDENTITY returned the last identity value inserted to TY by the trigger, which fired due to an earlier insert on TZ*/
68
69
请参见
自己写的一段测试代码


1
2 use pubs
3 go
4
5 create table tx
6 (
7      xid int identity(1,1) primary key,
8      xname varchar(50)
9 )
10 go
11
12 insert into tx values ('aaa')
13 insert into tx values ('bbb')
14 insert into tx values ('ccc')
15
16 select * from tx
17
18 create table tz
19 (
20      zid int identity(1,1) primary key,
21      zname varchar(50)
22 )
23 go
24
25 insert into tz values ('AAA')
26 insert into tz values ('BBB')
27 insert into tz values ('CCC')
28 insert into tz values ('DDD')
29 insert into tz values ('EEE')
30 insert into tz values ('FFF')
31
32 select * from tz
33
34 create trigger xztrig on tx
35 after insert
36 as
37     begin
38         insert into tz values ('gongxu')
39     end
40 go
41
42 insert into tx values ('myname')
43
44 SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
45 GO
46 SELECT   @@IDENTITY AS [@@IDENTITY]
47 GO
48
49 select * from tx
50 select * from tz

返回值为:

SCOPE_IDENTITY
---------------------------------------
4

(1 行受影响)

@@IDENTITY
---------------------------------------
7

(1 行受影响)


下面分别是两个表中的数据:


xid         xname
----------- --------------------------------------------------
1           aaa
2           bbb
3           ccc
4           myname

(4 行受影响)

zid         zname
----------- --------------------------------------------------
1           AAA
2           BBB
3           CCC
4           DDD
5           EEE
6           FFF
7           gongxu

(7 行受影响)
分享到:
评论

相关推荐

    sql语句返回主键SCOPE_IDENTITY()

    在这个存储过程中,`SELECT SCOPE_IDENTITY()`会返回存储过程内部插入操作所产生的IDENTITY值,保证了数据的一致性和准确性。 总的来说,`SCOPE_IDENTITY()`函数在SQL Server中是获取插入操作后自增主键值的安全...

    解决SQLServer最大流水号的方法

    解决 SQL Server 最大流水号的方法 SQL Server 中,最大流水...解决 SQL Server 最大流水号的问题可以使用 SCOPE_IDENTITY 函数或结合 UNIQUEIDENTIFIER 和 IDENTITY 的方法。开发者可以根据实际情况选择合适的方法。

    Identity用法

    ### Identity用法详解 在数据库管理系统中,`Identity` 是一个非常重要的概念,尤其是在 SQL Server 中,它被广泛应用于自动生成唯一标识符(通常用于主键)。本文将深入探讨 `Identity` 的用法及其相关特性。 ###...

    sql Identity

    - 如果需要跨表引用`Identity`值,建议使用`SCOPE_IDENTITY()`或者`IDENT_CURRENT()`,以避免不必要的错误。 通过以上介绍可以看出,在处理数据库中的复杂数据关系时,合理运用`Identity`属性及其相关的全局变量...

    对有insert触发器表取IDENTITY值时发现的问题

    然而,当你在一个具有INSERT触发器的表上使用`@@IDENTITY`时,可能会遇到一些意想不到的情况,这在标题和描述中已经有所提及。让我们深入探讨这个问题。 在T1表上设置了一个INSERT触发器,这个触发器会在插入新数据...

    使用SQL Server 获取插入记录后的ID(自动编号)

    总结来说,理解并正确使用 `@@IDENTITY`、`SCOPE_IDENTITY()` 和 `IDENT_CURRENT()` 这三个函数对于在SQL Server中处理自增ID至关重要,特别是当数据库设计涉及复杂的触发器和多表操作时。选择合适的函数能够确保你...

    SQL.rar_自动序列号

    "SQL.rar_自动序列号"这个压缩包文件可能包含了如何在SQL Server中创建和使用自动序列号,特别是生成结合日期和数字的序列号的方法。这种序列号类型在许多业务场景中非常有用,例如订单号、发票号等,因为它不仅保证...

    获取插入记录ID(2.0)

    在这里,我们使用`SCOPE_IDENTITY()`,因为它更安全。 ```csharp int newId = (int)insertCommand.ExecuteScalar(); // ExecuteScalar()返回第一条受影响的行的第一个值,对于INSERT操作,通常是新生成的ID ``` 6....

    将sqlserver表中指定数据转化为insert语句

    - `SCOPE_IDENTITY()`:与@@IDENTITY相似,但仅限于当前作用域。 - `IDENT_CURRENT('tableName')`:返回特定表的最后一个自增ID。 3. **使用动态SQL** 要排除自增列并处理非固定数据类型,你可以编写一个存储...

    asp中通过addnew添加内容后取得当前文章的自递增ID的方法

    而在.NET框架中,获取自递增ID的方法更加多样,可以使用SCOPE_IDENTITY()、@@IDENTITY、IDENT_CURRENT函数或者OUTPUT参数。每种方法都有其适用场景,选择合适的方法可以帮助开发者有效避免并发和作用域范围的问题。 ...

    ASP技术常遇问题解答-如何得到插入一条记录后最新的ID?.zip

    当使用SQL Server作为数据库时,`SCOPE_IDENTITY()`函数是获取最后由同一作用域内的INSERT语句生成的自动递增ID的最常见方法。它返回的是在同一事务或批处理中插入的最后一条记录的ID,确保了返回值的唯一性。 2. ...

    sqlserver 存储过程中If Else的用法实例

    在本实例中,我们将探讨如何在存储过程中使用`IF...ELSE`语句,以便在特定条件下执行不同的操作。具体场景是向数据库的B表中插入数据,其中A表的主键同时也是B表的外键,允许为空。 首先,让我们分析给出的存储过程...

    sql server经典面试题

    - 使用`SCOPE_IDENTITY()`、`@@IDENTITY`或`IDENT_CURRENT('table_name')`函数,但请注意它们的差异,例如`SCOPE_IDENTITY()`仅返回当前作用域内的最后生成的ID。 9. 通用分页存储过程 - 创建存储过程,接收页码...

    使用存储过程修改数据 (ADO.NET).txt

    5. **填充和更新数据集**:使用`Fill`方法将数据加载到`DataTable`中,然后使用`Update`方法将更改的数据行更新回数据库。 ### 处理输出参数和返回值 在调用存储过程时,正确处理输出参数和返回值对于确保数据完整...

    SQL Server 存储层级数据实现无限级分类,左右值分类

    SET @NID = SCOPE_IDENTITY(); END SELECT @NID; END; ``` ##### 3. 删除节点 为了删除一个节点及其所有子节点,可以创建一个名为 `CLSP_ZoneDelete` 的存储过程。此过程接受一个参数:待删除节点的ID (`@ID`)...

    sqlserver数据库著名上级面试题目

    - 使用`SCOPE_IDENTITY()`、`IDENT_CURRENT()`或`@@IDENTITY`函数可以获取最近插入的自增字段的值。`SCOPE_IDENTITY()`返回同一事务中最后一个语句生成的标识符,是最安全的选择。 9. **通用分页存储过程** - ...

    PHP封装的MSSql操作类完整实例

    文章还提到了几个特别的函数,比如SetTextSize,这通常用于设置返回结果的文本大小限制,以及Scope_Identity和@@RowCount,分别用于获取最新插入记录的自增ID和查询或操作影响的行数。 整个操作类都是为了使开发者...

    C#数据库教程2-ADO.NET常用SQL语句

    第三点,当你在执行INSERT操作后需要获取自增字段的值(例如主键ID),可以利用`IDENTITY`属性和`SCOPE_IDENTITY()`函数。在C#中,你可以在同一个数据库事务中执行INSERT和SELECT语句,以获取新生成的ID: ```...

    c#连接sqlserver数据库插入数据从数据库获取时间示

    这里使用了参数化查询以防止SQL注入,并通过`SCOPE_IDENTITY()`获取新插入行的自动增长ID。 5. **创建SqlCommand对象**:使用`SqlCommand`类创建一个命令对象,设置其CommandText属性为上面的SQL语句,并将连接...

Global site tag (gtag.js) - Google Analytics