SqlServer2000,插入一条记录后.如何得到刚插入记录的Id?(100分)

L

luaijun

Unregistered / Unconfirmed
GUEST, unregistred user!
会有多个人插入记录,怎么保证得到的Id是我刚插入记录的Id呢?
 
哈哈,抢分了
select @@IDENTITY
mssql的帮助
下面的示例向带有标识列的表中插入一行,并用 @@IDENTITY 显示在新行中使用的标识值。
INSERT INTO jobs (job_desc,min_lvl,max_lvl)
VALUES ('Accountant',12,125)
SELECT @@IDENTITY AS 'Identity'

 
wuyang,谢谢你的回答,不过我认为还有点问题
我要得到是刚才我插入记录的Id,并不是最新记录的Id?我插入记录后,立刻取它的Id,
但是在这个时候难道不可有新的记录插进去吗?
 
上面那个例子是一个批处理,mssql是连在一齐执行的,别的记录插入也要等那个批处理
执行完毕之后(包括其他用户的插入记录)
 
我觉得luaijun的担心已经牵扯到事务管理的问题了,这种可能性是存在的,但概率很低,
可以不管,实在不行,可以自己加上一些代码进行事务控制,但我觉得没有必要
 
用存储过程就可以实现,可以保证取回自己刚插入的记录的id
CREATE PROCEDURE log_login --系统日志记录
(
@user_id varchar(6), --用户名
@mod_id smallint,
@fun_id smallint,
@log_id int output
)
as
begin tran
insert into syslog (user_id,mod_id,fun_id,log_in)values(@user_id,@mod_id,@fun_id,getdate())
commit tran
select @log_id=(select max(Log_id) from syslog)
GO
 
谢谢各位的回答
这个问题是我在同别人合作的一个项目中作设计时想到的一个问题,可能存储过程是不能用
的.
wuyang,你说这是一个批处理 ,可是我在客户端如何用执行这个语句呢?
以vb+ado为例,这个SQl语句怎么写?
sql="INSERT INTO jobs (job_desc,min_lvl,max_lvl)
VALUES ('Accountant',12,125)
SELECT @@IDENTITY AS 'Identity'"
conn.execute(sql)
这样不行吧,若是分开写分开执行,可能就不是批处理了吧?
用事务?

 
写个事务处理吧
 
ado用client游标,我常试过的 ,一般你插入提交到服务器后,马上就可以读出里面的
id值!
 
procedure TForm1.Button1Click(Sender: TObject);
begin
adotable1.Insert ;
adotable1.FieldByName('name').AsString :='dfaa';
adotable1.FieldByName('parentid').AsInteger :=1;
adotable1.Post ;
ShowMessage(adotable1.fieldbyname('id').AsString );
end;

adotable1的cursorLocation=client
马上就可以得到id的,不知道我说的对不对!
 
with ADOQuery1 do begin
with SQL do begin
Clear;
Add(‘INSERT INTO jobs (job_desc,min_lvl,max_lvl) VALUES (''Accountant'',12,125)');
Add('SELECT @@IDENTITY AS ''Identity''');
end;
Open;
end;
id=ADOQuery1.fieldbyname('Identity').asinteger;
 
多人接受答案了。
 
顶部