数据库实际应用中,我们往往需要得到刚刚插入的标志值来往相关表中写入数据。但我们平常得到的真的是我们需要的那个值么?
有时我们会使用
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
()
分享到:
相关推荐
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 SET IDENTITY_INSERT 想要将值插入到自动编号(或者说是标识列,IDENTITY)中去,需要设定 SET IDENTITY_INSERT
而在ASP程序中会返回错误信息: 引用内容 Microsoft OLE DB Provider for SQL Server 错误 ‘80040e14’ 当 IDENTITY_Insert 设置为 OFF 时,不能向表 ‘member’ 中的标识列插入显式值。
有的情况我们需要手动插入标识列的值,例如删除了一些记录后,标识列并不连续,而我们又想把它补齐。我们利用一个开关可以让愿望变成现实: 代码如下:SET IDENTITY_Insert [TableName] ON 在查
错误现象: Microsoft OLE DB Provider for SQL Server 错误 ‘80040e2f’不能将值 NULL 插入列 ‘id’,表 ‘web.dbo.dingdan’;列不允许有空值。... 您可能感兴趣的文章:SqlServer下通过XML拆分字符串的方
介绍就不多说了,下边是部分目录,觉得有用的话就顶一个 C:. │ sqlserver2000.txt │ ├─第01章 │ 1.9.1 设置内存选项.sql │ 1.9.2(2) 使用文件及文件组.sql │ 1.9.2(3) 调整...
服务器端代理是保存在SQLServer主机中的一个只读存储过程,他的作用是接受客户端请求,读取在线事物日志块并通过网络传给客户端软件,由客户端软件来读取这些原始的数据块来完成Log Explore所提供的所有功能。...
有时开发需要我们需把新插入的记录之后立即返回插入记录的ID哦,下面给大家介绍mssqlserver返回新添加的记录的标识列的值sql语句
动网SqlServer版本论坛8.2版本的,我成功安装过,导入数据的时候记得启用插入标识哦; 这个是动网论坛的程序,但是官网上没有SqlServer版本的,大家要是觉得不值得可以不下载,不要JJYY。你不下载系统也不会扣你的...
在包含标识列的表中插入值时,Microsoft SQL Server 将基于上一次使用的标识值(标识种子属性)和在创建列时指定的增量值(标识增量属性)自动生成下一个标识符。 注意: 只能为不允许空值且数据类型为 decimal、int...
第一章 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 ...
通过界面设计上是能手工操作的,无法达到我批量修改几千台服务器。 因为此了一个脚本来批量执行。 环境:redgate + mssql 2008 r2 以下代码根据自己的业务稍做修改即使...1 GO –插入id=8001-8003的行 –恢复标识列标记
php mysql+sql server 数据库处理类 /* 文 件 名:CDataBase.php 类 名:CDataBase 继承关系:XMLClass 通用属性: $Con | 数据连接标识 $DBaseName | 数据库名称 $UserID | 数据库登陆用户名 $PassWord | ...
│ sqlserver2000.txt │ ├─第01章 │ 1.9.1 设置内存选项.sql │ 1.9.2(2) 使用文件及文件组.sql │ 1.9.2(3) 调整tempdb数据库的文件属性.sql │ ├─第02章 │ │ 2.1 日期概念理解中的一些测试.sql │ │ ...
SQL Server 2008是微软的SQL Server数据库中的最新版本,在该版本的数据库产品中融入了更多商业智能的内容。本书中也使用了一篇专门讲解了与商业智能有关的一些内容。 本书总分为5篇,共21章。第一篇主要讲解数据库...
服务器端代理是保存在SQLServer主机中的一个只读存储过程,他的作用是接受客户端请求,读取在线事物日志块并通过网络传给客户端软件,由客户端软件来读取这些原始的数据块来完成Log Explore所提供的所有功能。...
liquibase-mssql MS SQL Server特定扩展此扩展程序将插入和load_data命令包装为“打开/关闭设置标识_插入表名”,以便在使用MS SQL Server时可以将数据插入自动增量列中。 对于命令行界面(CLI) 为了使用此扩展,请...