`

在SQL Server 中如何得到刚刚插入的标识值

阅读更多

数据库实际应用中,我们往往需要得到刚刚插入的标志值来往相关表中写入数据。但我们平常得到的真的是我们需要的那个值么?

有时我们会使用

SELECT @@Identity

来获得我们刚刚插入的值,比如下面的代码

<!-- <br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->代码一:
use
tempdb
if exists ( select * from sys.objects where object_id = object_id (N ' [test1] ' ) and type in (N ' u ' ))
drop table [ test1 ]
go
create table test1
(
id
int identity ( 1 , 1 ),
content
nvarchar ( 100 )
)
insert into test1(content)
values ( ' solorez ' )
select @@identity

乐观情况下,这样做是没问题的,但如果我们如果先运行下面的代码二创建一个触发器、再运行代码三:

<!-- <br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->代码二:
create
table test2
(
id
int identity ( 100 , 1 ),
content
nvarchar ( 100 )
)

create trigger tri_test1_identitytest_I
on test1after insert
as
begin
insert into test2
select content from inserted
end
代码三:
insert
into test1(content)
values ( ' solorez2 ' )
select @@identity

我们可以看到,此时得到的标识值已经是100多了,很明显,这是表test2的生成的标识值,已经不是我们想要的了。

我们可以看看@@identity的定义:Identity

原来,@@identity返回的是当前事务最后插入的标识值。

这时我们或许会用下面的方法:

<!-- <br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->代码四:
insert
into test1(content)
values ( ' solorez3 ' )
SELECT IDENT_CURRENT( ' test1 ' )

看来结果还比较正确,但如果我们在多次运行代码四的同时运行下面的代码五:

<!-- <br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->代码五:
insert
into test1(content)
values ( ' solorez3 ' )

waitfor delay ' 00:00:20 '
SELECT IDENT_CURRENT( ' test1 ' )

结果又不是我们想要的了!

再看看IDENT_CURRENT(Tablename) 的定义:IDENT_CURRENT (Tablename)

是返回指定表的最后标识值。

到这里,是该亮出答案的时候了,我们可以使用下面的代码:

<!-- <br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->代码六:
insert
into test1(content)
values ( ' solorez3 ' )

SELECT scope_identity ()

这时,我们无论是添加触发器还是运行并行插入,得到的始终是当前事务的标识值。

scope_identity()的定义:scope_identity ()

分享到:
评论

相关推荐

    SQLServer2005考试题及答案

    SQLServer考试题及答案 选择题: 1、在MS SQL Server中,用来显示数据库信息的系统存储过程是( ) A sp_ dbhelp B sp_ db C sp_ help D sp_ helpdb 2、SQL语言中,删除一个表的命令是( ) A DELETE B DROP C ...

    SQL Server 之 SET IDENTITY_INSERT

    SQL Server 之 SET IDENTITY_INSERT SET IDENTITY_INSERT 想要将值插入到自动编号(或者说是标识列,IDENTITY)中去,需要设定 SET IDENTITY_INSERT

    在SQL Server数据库中为标识(IDENTITY)列插入显式值

    而在ASP程序中会返回错误信息: 引用内容 Microsoft OLE DB Provider for SQL Server 错误 ‘80040e14’ 当 IDENTITY_Insert 设置为 OFF 时,不能向表 ‘member’ 中的标识列插入显式值。

    SQL Server手工插入标识列的方法

     有的情况我们需要手动插入标识列的值,例如删除了一些记录后,标识列并不连续,而我们又想把它补齐。我们利用一个开关可以让愿望变成现实: 代码如下:SET IDENTITY_Insert [TableName] ON 在查

    sqlserver 不能将值NULL插入列id(列不允许有空值解决)

    错误现象:  Microsoft OLE DB Provider for SQL Server 错误 ‘80040e2f’不能将值 NULL 插入列 ‘id’,表 ‘web.dbo.dingdan’;列不允许有空值。... 您可能感兴趣的文章:SqlServer下通过XML拆分字符串的方

    Sqlserver2000经典脚本

    介绍就不多说了,下边是部分目录,觉得有用的话就顶一个 C:. │ sqlserver2000.txt │ ├─第01章 │ 1.9.1 设置内存选项.sql │ 1.9.2(2) 使用文件及文件组.sql │ 1.9.2(3) 调整...

    Log Explorer for SQL Server v4.22 含注册机

    服务器端代理是保存在SQLServer主机中的一个只读存储过程,他的作用是接受客户端请求,读取在线事物日志块并通过网络传给客户端软件,由客户端软件来读取这些原始的数据块来完成Log Explore所提供的所有功能。...

    sql server获得新记录标识列值的二种方法

    有时开发需要我们需把新插入的记录之后立即返回插入记录的ID哦,下面给大家介绍mssqlserver返回新添加的记录的标识列的值sql语句

    动网论坛Dvbbs8.2.0(sqlserver版本)

    动网SqlServer版本论坛8.2版本的,我成功安装过,导入数据的时候记得启用插入标识哦; 这个是动网论坛的程序,但是官网上没有SqlServer版本的,大家要是觉得不值得可以不下载,不要JJYY。你不下载系统也不会扣你的...

    SQL server 2005中设置自动编号字段的方法

    在包含标识列的表中插入值时,Microsoft SQL Server 将基于上一次使用的标识值(标识种子属性)和在创建列时指定的增量值(标识增量属性)自动生成下一个标识符。 注意: 只能为不允许空值且数据类型为 decimal、int...

    SQLSserver2008 上

    第一章 SQL Server基础 ? ? 1、SQL 2008视频教程—SQL数据库连接 ? 2、SQL 2008视频教程-系统数据库 ? 3、SQL 2008视频教程-数据库创建 ? 4、SQL 2008视频教程-数据库创建2 ? 5、SQL 视频教程-对...

    标识列与普通列相互转换示例

    标识列与普通列相互转的示例 --创建测试表 CREATE TABLE t1(ID int IDENTITY,A int) GO --插入记录 INSERT t1 VALUES(1) GO --1. 将IDENTITY(标识)列变为普通列 ALTER TABLE t1 ADD ID_temp int GO UPDATE t1 SET ...

    SQL Server修改标识列方法 如自增列的批量化修改

    通过界面设计上是能手工操作的,无法达到我批量修改几千台服务器。 因为此了一个脚本来批量执行。 环境:redgate + mssql 2008 r2 以下代码根据自己的业务稍做修改即使...1 GO –插入id=8001-8003的行 –恢复标识列标记

    php mysql+sql server 数据库处理类

    php mysql+sql server 数据库处理类 /* 文 件 名:CDataBase.php 类 名:CDataBase 继承关系:XMLClass 通用属性: $Con | 数据连接标识 $DBaseName | 数据库名称 $UserID | 数据库登陆用户名 $PassWord | ...

    经典SQL脚本大全

    │ sqlserver2000.txt │ ├─第01章 │ 1.9.1 设置内存选项.sql │ 1.9.2(2) 使用文件及文件组.sql │ 1.9.2(3) 调整tempdb数据库的文件属性.sql │ ├─第02章 │ │ 2.1 日期概念理解中的一些测试.sql │ │ ...

    21天学会SQL

    SQL Server 2008是微软的SQL Server数据库中的最新版本,在该版本的数据库产品中融入了更多商业智能的内容。本书中也使用了一篇专门讲解了与商业智能有关的一些内容。 本书总分为5篇,共21章。第一篇主要讲解数据库...

    Log Explorer for SQL Server v4.22

    服务器端代理是保存在SQLServer主机中的一个只读存储过程,他的作用是接受客户端请求,读取在线事物日志块并通过网络传给客户端软件,由客户端软件来读取这些原始的数据块来完成Log Explore所提供的所有功能。...

    liquibase-mssql:MS SQL Server特定扩展

    liquibase-mssql MS SQL Server特定扩展此扩展程序将插入和load_data命令包装为“打开/关闭设置标识_插入表名”,以便在使用MS SQL Server时可以将数据插入自动增量列中。 对于命令行界面(CLI) 为了使用此扩展,请...

Global site tag (gtag.js) - Google Analytics