日期:2014-05-19  浏览次数:20475 次

得到刚才插入的记录的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进行传递