SQL SERVER 2000 中的标识值获取函数

原创 2005年07月28日 16:45:00

SQL SERVER 2000 中的标识值获取函数

IDENTITY(标识)列,也有很多人称之为自增列,在SQL Server 2000中,标识列通过IDENTITY来定义,下面是与获取最后插入记录的标识值有关的函数的一个示例说明

    SQL Server 中,可以使用 SCOPE_IDENTITY()、 @@IDENTITY 、 IDENT_CURRENT() 来取得最后插入记录的值值,它们的区别在于:
SCOPE_IDENTITY() 返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值。一个作用域就是一个模块——存储过程、触发器、函数或批处理。因此,如果两个语句处于同一个存储过程、函数或批处理中,则它们位于相同的作用域中。
@@IDENTITY       返回在当前会话的所有表中生成的最后一个标识值
IDENT_CURRENT()  返回为任何会话和任何作用域中的指定表最后生成的标识值
下面以一个示例来说明它们的区别

-- a) 示例代码

-- ===========================================
-- 创建测试表
-- ===========================================
USE tempdb
GO

CREATE TABLE t1(id int IDENTITY,col int)
INSERT t1 SELECT 1
UNION ALL SELECT 2
CREATE TABLE t2(id int IDENTITY,col int)
GO

CREATE TRIGGER TR_insert_t2 ON t2
FOR INSERT
AS
    INSERT t1 SELECT 3
GO

-- ===========================================
-- 测试三个函数..1
-- ===========================================
INSERT t2 VALUES(1)
SELECT [SCOPE_IDENTITY()]=SCOPE_IDENTITY(),
    [@@IDENTITY]=@@IDENTITY,
    [IDENT_CURRENT() For t1]=IDENT_CURRENT(N't1'),
    [IDENT_CURRENT() For t2]=IDENT_CURRENT(N't2')

/*--结果
SCOPE_IDENTITY()   @@IDENTITY   IDENT_CURRENT() For t1     IDENT_CURRENT() For t2                   
------------------ ------------ -------------------------- -----------------------
1                  3            3                          1

(所影响的行数为 1 行)
--*/
GO

-- ===========================================
-- 测试三个函数..2
-- ===========================================
INSERT t1 VALUES(10)
SELECT [SCOPE_IDENTITY()]=SCOPE_IDENTITY(),
    [@@IDENTITY]=@@IDENTITY,
    [IDENT_CURRENT() For t1]=IDENT_CURRENT(N't1'),
    [IDENT_CURRENT() For t2]=IDENT_CURRENT(N't2')

/*--结果
SCOPE_IDENTITY()   @@IDENTITY   IDENT_CURRENT() For t1     IDENT_CURRENT() For t2                   
------------------ ------------ -------------------------- -----------------------
4                  4            4                          1

(所影响的行数为 1 行)
--*/
GO

-- ===========================================
-- 测试三个函数..3
-- ** 开启一个新连接,执行下面的代码 **
-- ===========================================
SELECT [SCOPE_IDENTITY()]=SCOPE_IDENTITY(),
    [@@IDENTITY]=@@IDENTITY,
    [IDENT_CURRENT() For t1]=IDENT_CURRENT(N't1'),
    [IDENT_CURRENT() For t2]=IDENT_CURRENT(N't2')

/*--结果
SCOPE_IDENTITY()   @@IDENTITY   IDENT_CURRENT() For t1     IDENT_CURRENT() For t2                   
------------------ ------------ -------------------------- -----------------------
NULL               NULL         4                         &n

--===========================================
-- 删除测试环境
-- ===========================================
DROP TABLE t1,t2

-- b) 代码结果说明

从上面的代码可以看到:
IDENT_CURRENT()  始终返回指定表最后插入的标识值
@@IDENTITY       返回当前会话的标识值,无论是否在同一个作用域,在测试1、2中,可以看到它返回的是触发器中插入记录的标识值,而在测试3中,因为当前会话无插入记录,所以返回NULL
SCOPE_IDENTITY() 返回当前会话同一作用域的标识值,所以在测试1、2中,它返回的值不受触发器的影响,而在测试3中,因为当前会话无插入记录,所以返回NULL

SQL-Server重置自标识列 应用

1.重置标识方法:  方法一:       使用Truncate      TRUNCATE TABLE name可以删除表内所有值并重置标识值 ,但是表内的数据将丢失。   方法二:   ...
  • chenguang79
  • chenguang79
  • 2014年06月10日 13:42
  • 830

SQL Server 2000中查询表名,列名及字段类型

经常碰到一些忘记表名称的情况,此时只记得个大概,此时可通过查询系统表Sysobjects找到所要的表名,如要查找包含用户的表名,可通过以下SQL语句实现, Select * From sy...
  • voodooer
  • voodooer
  • 2014年01月13日 08:33
  • 11584

SQL Server 2000 创建角色,用户,权限(转)

创建角色,用户,权限 /*--示例说明         示例在数据库pubs中创建一个拥有表jobs的所有权限、拥有表titles的SELECT权限的角色r_test     随后创建了一个...
  • xiuping05214
  • xiuping05214
  • 2013年12月05日 15:03
  • 1676

SQL Server 2000/2008导入导出数据表

SQL Server 2000/2005/2008将excel导入数据库表、将一个数据库的数据表导入到另一个数据库,也可以是2台电脑/云服务器上的数据库的数据表之间的导入方法一样。数据表的导出方法相仿...
  • Gordennizaicunzai
  • Gordennizaicunzai
  • 2016年02月28日 22:18
  • 1150

sql server 2008表值函数的使用

场景:输入片区号,查询该片区的所有用户最后一次的消费记录。 有两张表:用户信息、流水账。如果用传统方法查: 1.查询该地区所有的人。 2.循环查询出每个人最后一次的消费记录问题:数据连接次数=人数+1...
  • u012662357
  • u012662357
  • 2016年04月06日 17:34
  • 1226

SQL Server合并列值

说明:由于考勤系统中出来的打卡记录是按照工号,打卡日期,打卡时间以行的方式来显示的,现在需要按照工号,打卡日期来整理每个人每天的打卡时间 原格式: 整理后格式: 数据库表结构如下: C...
  • mangkata
  • mangkata
  • 2016年09月18日 14:08
  • 495

将sql server 2000的备份文件导入到sql server 2012中

将sql server 2000的备份文件导入到sql server 2012中
  • jhope
  • jhope
  • 2017年04月04日 05:58
  • 574

sql DEFAULT 和 NULL 不允许作为显式标识值

SQL  INSERT INTO错误: DEFAULT 和 NULL 不允许作为显式标识值 错误原因:插入值时自增列插入了值,我的表主键设置为自增列,当插入数据时不允许将数值插入自增列。 如下: ...
  • keep_running2
  • keep_running2
  • 2013年03月25日 16:04
  • 4316

解决SQL server 2000 个人版 XP能用 不能在win7 64位系统上安装的问题

最近学习到数据库这个课程,但是看见
  • u013628862
  • u013628862
  • 2014年11月24日 15:09
  • 5885

SQL2000里的数据类型

(1)char、varchar、text和nchar、nvarchar、ntext char和varchar的长度都在1到8000之间,它们的区别在于char是定长字符数据,而varchar是变长字...
  • haibo0668
  • haibo0668
  • 2016年06月02日 12:52
  • 873
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQL SERVER 2000 中的标识值获取函数
举报原因:
原因补充:

(最多只允许输入30个字)