向表中插入记录后,怎样取得自增字段的值

zzao 2007-09-12 04:41:49
表A,结构如下,其中ID为自增字段:
CREATE TABLE [dbo].[SalesOrder] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[Number] [varchar] (20) ,
[CustomerID] [int] NOT NULL
) ON [PRIMARY]

现在向SalesOrder中插入一条记录,然后获取该条记录的ID,语句如下:
declare @id int
insert into SalesOrder(number,customerid) values('0001',1)
set @id = IDENT_CURRENT(SalesOrder)
一直没错,最近发现取的ID错了,原来是在执行set @id = IDENT_CURRENT(SalesOrder)
时,别的用户又增加了一条记录,查帮助中解释如下:

IDENT_CURRENT
返回为任何会话和任何作用域中的指定表最后生成的标识值。

请问:如果返回为当前会话和当前作用域中的指定表最后生成的标识值。







...全文
229 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
brother2605 2007-09-12
  • 打赏
  • 举报
回复
--看看这个对你有没有帮助
if exists(select name from sysobjects where name='xyzx'and type='U')
drop table xyzx
go
create table xyzx(id int identity(1,1),dept_no1 varchar(20), dept_no2 varchar(20))
go
declare @table table(id int)
insert xyzx
output INSERTED.id into @table
select '11', '101'
union all select '11', '102'
union all select '11', '103'
union all select '101', '10111'
union all select '102', '10122'
union all select '10111', '11111'
union all select '10122', '12111'
union all select '11111', '111111'
select*from @table
/*
id
-----------
1
2
3
4
5
6
7
8
*/
wgzaaa 2007-09-12
  • 打赏
  • 举报
回复
这样不给老大面,我会不自在的,开玩笑,老大肚量大
nzperfect 2007-09-12
  • 打赏
  • 举报
回复
wgzaaa() 傻的 ^^
libin_ftsafe
的意思就是让楼主去查这两个嘛
nzperfect 2007-09-12
  • 打赏
  • 举报
回复
IDENT_CURRENT 返回为某个会话和用域中的指定表生成的最新标识值。


@@IDENTITY 返回为跨所有作用域的当前会话中的某个表生成的最新标识值。


SCOPE_IDENTITY 返回为当前会话和当前作用域中的某个表生成的最新标识值。

按你的要求,当然是SCOPE_IDENTITY了.
dobear_0922 2007-09-12
  • 打赏
  • 举报
回复
SELECT SCOPE_IDENTITY()
wgzaaa 2007-09-12
  • 打赏
  • 举报
回复
SCOPE_IDENTITY 紧跟在操作语句应该不会有问题
wgzaaa 2007-09-12
  • 打赏
  • 举报
回复
@@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。
老大说的一般不会出问题,但当当前会话的本次作用产生了别的作用域(例如触发了其他动作)得到的结果就有可能不是你要的。
zzao 2007-09-12
  • 打赏
  • 举报
回复
这两个好象也不行,帮助中这样解释:
在一条 INSERT、SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含此语句产生的最后的标识值。若此语句没有影响任何有标识列的表,则 @@IDENTITY 返回 NULL。若插入了多个行,则会产生多个标识值,@@IDENTITY 返回最后产生的标识值。如果此语句激发一个或多个执行产生标识值的插入操作的触发器,则语句执行后立即调用 @@IDENTITY 将返回由触发器产生的最后的标识值。若 INSERT 或 SELECT INTO 语句失败或大容量复制失败,或事务被回滚,则 @@IDENTITY 值不会还原为以前的设置。

在返回插入到表的 @@IDENTITY 列的最后一个值方面,@@IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT 函数类似。

@@IDENTITY 和 SCOPE_IDENTITY 将返回在当前会话的所有表中生成的最后一个标识值。但是,SCOPE_IDENTITY 只在当前作用域内返回值,而 @@IDENTITY 不限于特定的作用域。

wgzaaa 2007-09-12
  • 打赏
  • 举报
回复
SELECT SCOPE_IDENTITY()
子陌红尘 2007-09-12
  • 打赏
  • 举报
回复
select @@IDENTIY

select SCOPE_IDENTITY()

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧