- 浏览: 251525 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
u010181690:
怎么我的不管事呢
JSEnhancements for vs2012 -
sunqing0316:
public static DateTime? GetData ...
详解System.Nullable<值类型> -
sunqing0316:
请问public static DateTime? GetDa ...
详解System.Nullable<值类型> -
3eirc3:
不错,下载下来试试,原来用vs2010时的那个工具和现在这个不 ...
JSEnhancements for vs2012 -
3eirc3:
[url][b][i][u]引用[list]
[*][img] ...
JSEnhancements for vs2012
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 行受影响)
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 行受影响)
发表评论
-
按月分类统计
2014-07-03 13:23 642select case when AudioType=1 t ... -
SQL Server附加数据库提示5120错误解决
2014-05-15 15:16 671 -
电话验证
2014-04-09 10:47 481private const string REG_M ... -
SQL Server数据库大型应用解决方案总结
2014-04-02 16:17 553http://tech.it168.com/a2012/011 ... -
new Date(myDateString)在IE中输出NaN,在火狐和谷歌浏览器中正常
2014-04-01 11:18 947今天在工作中遇到这样一个问题:使用jquery ui的date ... -
日历查看课程(支持从指定日期开始显示日历)
2014-03-31 09:28 648日历查看课程(支持从指定日期开始显示日历),增强浏览器兼容性, ... -
javascript之数组操作
2014-03-18 14:49 2931、数组的创建 var arrayO ... -
string和stringBuilder区别
2014-03-07 10:15 641C# String 对象是不可改变的。每次使用 System ... -
C#.net cookie、session实现自动登陆
2013-11-08 13:35 1901C#.net cookie、session实现 ... -
多条件查询的存储过程的写法
2013-11-04 15:07 503USE [ESD] GO /****** Object: S ... -
多条件查询的存储过程的写法
2013-11-04 15:06 535USE [ESD] GO /****** Object: S ... -
linq left join
2013-11-04 15:04 722linq left join var list = fro ... -
HttpHandler和HttpModule
2013-11-04 15:03 622HttpHandler和HttpModule ... -
如何过滤一个集合
2013-10-10 18:45 653List<Lenovo.SDI.ESD.Entiti ... -
DropdownList动态控制显示的值
2013-10-10 18:43 622DropdownList.Items.Insert(0, ne ... -
asp.net的<% %>总结
2013-08-30 17:01 722asp.net的<% %>总结 ... -
trim
2013-08-30 14:04 390string auditorsName.Trim(','); ... -
身份证号验证
2013-08-08 17:32 899经典js身份证验证 /* 功能:验证身份证号码是 ... -
去验证邮箱功能
2013-08-08 15:43 763很多网站都有邮箱验证的功能,用户发送完验证邮件后,点击&quo ... -
javascript:回车事件
2013-08-01 17:15 657/* * 页面回车事件 */ function BindEnt ...
相关推荐
在这个存储过程中,`SELECT SCOPE_IDENTITY()`会返回存储过程内部插入操作所产生的IDENTITY值,保证了数据的一致性和准确性。 总的来说,`SCOPE_IDENTITY()`函数在SQL Server中是获取插入操作后自增主键值的安全...
解决 SQL Server 最大流水号的方法 SQL Server 中,最大流水...解决 SQL Server 最大流水号的问题可以使用 SCOPE_IDENTITY 函数或结合 UNIQUEIDENTIFIER 和 IDENTITY 的方法。开发者可以根据实际情况选择合适的方法。
### Identity用法详解 在数据库管理系统中,`Identity` 是一个非常重要的概念,尤其是在 SQL Server 中,它被广泛应用于自动生成唯一标识符(通常用于主键)。本文将深入探讨 `Identity` 的用法及其相关特性。 ###...
- 如果需要跨表引用`Identity`值,建议使用`SCOPE_IDENTITY()`或者`IDENT_CURRENT()`,以避免不必要的错误。 通过以上介绍可以看出,在处理数据库中的复杂数据关系时,合理运用`Identity`属性及其相关的全局变量...
然而,当你在一个具有INSERT触发器的表上使用`@@IDENTITY`时,可能会遇到一些意想不到的情况,这在标题和描述中已经有所提及。让我们深入探讨这个问题。 在T1表上设置了一个INSERT触发器,这个触发器会在插入新数据...
总结来说,理解并正确使用 `@@IDENTITY`、`SCOPE_IDENTITY()` 和 `IDENT_CURRENT()` 这三个函数对于在SQL Server中处理自增ID至关重要,特别是当数据库设计涉及复杂的触发器和多表操作时。选择合适的函数能够确保你...
"SQL.rar_自动序列号"这个压缩包文件可能包含了如何在SQL Server中创建和使用自动序列号,特别是生成结合日期和数字的序列号的方法。这种序列号类型在许多业务场景中非常有用,例如订单号、发票号等,因为它不仅保证...
在这里,我们使用`SCOPE_IDENTITY()`,因为它更安全。 ```csharp int newId = (int)insertCommand.ExecuteScalar(); // ExecuteScalar()返回第一条受影响的行的第一个值,对于INSERT操作,通常是新生成的ID ``` 6....
- `SCOPE_IDENTITY()`:与@@IDENTITY相似,但仅限于当前作用域。 - `IDENT_CURRENT('tableName')`:返回特定表的最后一个自增ID。 3. **使用动态SQL** 要排除自增列并处理非固定数据类型,你可以编写一个存储...
而在.NET框架中,获取自递增ID的方法更加多样,可以使用SCOPE_IDENTITY()、@@IDENTITY、IDENT_CURRENT函数或者OUTPUT参数。每种方法都有其适用场景,选择合适的方法可以帮助开发者有效避免并发和作用域范围的问题。 ...
当使用SQL Server作为数据库时,`SCOPE_IDENTITY()`函数是获取最后由同一作用域内的INSERT语句生成的自动递增ID的最常见方法。它返回的是在同一事务或批处理中插入的最后一条记录的ID,确保了返回值的唯一性。 2. ...
在本实例中,我们将探讨如何在存储过程中使用`IF...ELSE`语句,以便在特定条件下执行不同的操作。具体场景是向数据库的B表中插入数据,其中A表的主键同时也是B表的外键,允许为空。 首先,让我们分析给出的存储过程...
- 使用`SCOPE_IDENTITY()`、`@@IDENTITY`或`IDENT_CURRENT('table_name')`函数,但请注意它们的差异,例如`SCOPE_IDENTITY()`仅返回当前作用域内的最后生成的ID。 9. 通用分页存储过程 - 创建存储过程,接收页码...
5. **填充和更新数据集**:使用`Fill`方法将数据加载到`DataTable`中,然后使用`Update`方法将更改的数据行更新回数据库。 ### 处理输出参数和返回值 在调用存储过程时,正确处理输出参数和返回值对于确保数据完整...
SET @NID = SCOPE_IDENTITY(); END SELECT @NID; END; ``` ##### 3. 删除节点 为了删除一个节点及其所有子节点,可以创建一个名为 `CLSP_ZoneDelete` 的存储过程。此过程接受一个参数:待删除节点的ID (`@ID`)...
- 使用`SCOPE_IDENTITY()`、`IDENT_CURRENT()`或`@@IDENTITY`函数可以获取最近插入的自增字段的值。`SCOPE_IDENTITY()`返回同一事务中最后一个语句生成的标识符,是最安全的选择。 9. **通用分页存储过程** - ...
文章还提到了几个特别的函数,比如SetTextSize,这通常用于设置返回结果的文本大小限制,以及Scope_Identity和@@RowCount,分别用于获取最新插入记录的自增ID和查询或操作影响的行数。 整个操作类都是为了使开发者...
第三点,当你在执行INSERT操作后需要获取自增字段的值(例如主键ID),可以利用`IDENTITY`属性和`SCOPE_IDENTITY()`函数。在C#中,你可以在同一个数据库事务中执行INSERT和SELECT语句,以获取新生成的ID: ```...
这里使用了参数化查询以防止SQL注入,并通过`SCOPE_IDENTITY()`获取新插入行的自动增长ID。 5. **创建SqlCommand对象**:使用`SqlCommand`类创建一个命令对象,设置其CommandText属性为上面的SQL语句,并将连接...