sql server返回插入记录的ID(多条记录)

需要先插入多条数据到表1,然后再将表1中插入的多条记录的ID插入到表2,这种情况要怎么取到多个ID?表1的ID是自动增长的那种
是在SQL Server 2000下
我想要的效果是在存储过程中执行一条insert select语句插入多条数据,然后在每插入一条数据后返回刚插入的这条ID,因为这时需要把ID再插到另一个表中,这种效果能实现吗?
不用触发器可以实现吗?因为我是想只有批量插入时才调用这个存储过程

你的这个需求好象直接再把记录插入到表2就可以,但我估计你不是这个意思。

比较笨的办法,可以定义一个数组用于记录表1的ID值,或者用个临时表来记录表一新增加的记录ID列表。

insert后,query的指针应该还是停留在最新增加的记录上的,因此是可以取得到ID值的。

代码如下,假设表一只有二个字段,一个是ID(自动增量),一个是字段A(字符型),

var
sql:string;
id1:integer;
begin
sql:='insert into 表一 ('''+字段A+''') values ('''+ '内容'+''')';
query1.close;
query1.sql.clear;
query1.sql.add(sql);
query1.Execsql;
id1:=query1.fieldbyname('id').asinteger;
//接下来可以把ID1的值写入临时表或者数组了,如果是需要不同的机器取得ID值,可以用临时表,不过速度会慢些,如果只是本机取得,就用数组好了。
//后面的代码略
...
...

end;

上述代码我没有条件试,应该可以,另外还可以用append的方法追加记录,这样就一定可以用上面的方法取到ID值了。

var
id1:integer;
begin
query1.append;
query1.fieldbyname('字段A').asstring = '内容';
query1.post;
id1:=query1.fieldbyname('ID').asinteger;
//这种方法一定可以取得到ID值。
//后面你自行对取得的ID进行存储就行了,临时表或者数组都可以。代码略
end;
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-05-12
其实触发器是可以实现的,只要在触发器里面加入一个判断插入数据的行数就可以了:
IF object_id('TR_Insert_tableA') is not null
drop trigger TR_Insert_tableA
go
create trigger TR_Insert_tableA
on tableA for insert
as
begin
IF (Select count(*) from inserted)>1
begin
insert into tableB(id) select id from inserted
end
end
如果一定要用存储过程也是有很多办法的,具体可以Hi我本回答被提问者采纳
第2个回答  2010-05-29
插入数据如果带有时间字段,可以用查询语句找出来
insert into 表2
select id from 表1 where 时间条件

否则的话,在表1建立一个触发器,每插一次就插入表2

create trigger myt
as
begin
@id integer
select id into @at from inserted
if @id>0 then
insert into 表2
select id from inserted
end if
end