是否有一种有效的方法将一个表的所有行传输到另一个表,一次一个记录

时间:2012-05-15 23:02:03

标签: sql-server performance tsql triggers foreach

要求是将所有插入的记录转移到另一个表。我用过触发器来做到这一点。我循环遍历所有插入的记录并一次向新表插入一条记录,因为我必须在目标表中递增序列号。但是当插入的行数增加时,这个循环显着减慢。有没有更好的方法来做到这一点。

Declare @maxpk int, @count int, @seq int
set @maxpk=(select max(refno) from inserted )
set @count=(select count(1) from inserted)
set @seq=((select max(seq_no) from dbase.dbo.destination))

while @count>0
begin
set @seq=(select @seq+1)
insert into dbase.dbo.destination(orderno,SEQ_NO,PRODUCT_ID,qty)
select  ordernumber,@seq,productid ,quantity
from inserted where refno=@maxpk
set @count=(select @count-1)
set @maxpk=(select top 1 refno from inserted where refno<@maxpk)
end

refno是源表的主键。有没有办法检查插入记录的结束,所以我不必初始化和维护循环计数器?

并且可以对插入表中的每个记录执行循环,因此我不必通过比较主键的值来找到要插入的下一条记录。  使用mssql 2005

1 个答案:

答案 0 :(得分:2)

这应该处理并发性,但我真的认为你需要重新审视设计(例如make seq_noIDENTITY列,然后系统为你生成唯一值,并处理并发性)。

CREATE TRIGGER dbo.SourceTrg ON dbo.Source
AFTER INSERT
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @seq INT;
    SET @seq = COALESCE((SELECT MAX(seq_no) 
      FROM dbase.dbo.Destination WITH (TABLOCKX, HOLDLOCK)), 0);

    INSERT dbase.dbo.Destination(SEQ_NO, orderno, PRODUCT_ID, qty)
      SELECT @seq + ROW_NUMBER() OVER (ORDER BY refno),
        ordernumber, productid, quantity
      FROM inserted;
END
GO