读书人

得到刚才插入的记录的ID号,用什么方法

发布时间: 2012-01-20 18:53:53 作者: rapoo

得到刚才插入的记录的ID号,用什么方法最保险?!
数据库中讲了三种方法,有一个叫IDENT_CURRENT,一个叫@@INDENTY什么来着,还有一个忘记了.我一直都怀疑,好象这三种方法在并发状态下都不保险,
因为这个ID号要作为外键马上存入别的表中的.如果出了差错就完蛋啦.

[解决办法]
IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。


@@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。


SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值。
[解决办法]
我们管理系统里用的是IDENT_CURRENT
[解决办法]
些都只得最後一index值吧?要是批量插入好像就得不到想要的了.
比如create table a(id int identity, value int)
insert into a(value) select 10 union all select 20
用上面三,都只能得到最後插入的index,即id=2

看看能不能通器,inserted表中,找出要插入的id
[解决办法]
如果只要最後一id,考,所以只能table.用IDENT_CURRENT
[解决办法]
个人觉得SCOPE_IDENTITY()最保险
[解决办法]

--以下明很清楚,

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 值。


[解决办法]
建议使用IDENT_CURRENT
[解决办法]
我做售票系统时是这么做的,不知对你有没有参考价值:
CREATE PROCEDURE B_InsertAndReturnXh
AS
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE --锁死,在某人访问时禁止其他人访问
declare @MaxXh float
begin tran
select @MaxXh=isnull(max(xh),0)+1 from b_salesdata
insert into b_salesdata (xh) values(@MaxXh)
select @MaxXh --程序中对这个已经插入的号进行更新操作
commit tran

[解决办法]
SCOPE_IDENTITY
这个是2005才有的

[解决办法]
SCOPE_IDENTITY这个好一点,2000就有的
[解决办法]
因为当时我用VB写程序,以为SQL SERVER的int数据类型是-32768----32767之间的数,值域太小,所以用了float.
其实这说明我是个笨蛋,连值域都搞不懂.


[解决办法]
我用笨方法:
在存储过程种申明一个变量,insert后立即set @bianliang=@@identity,然后试用@biangliang进行传递

读书人网 >SQL Server

热点推荐