Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 是否有一种有效的方法可以将一个表的所有行转移到另一个表,一次转移一条记录_Sql Server_Performance_Tsql_Triggers_Foreach - Fatal编程技术网

Sql server 是否有一种有效的方法可以将一个表的所有行转移到另一个表,一次转移一条记录

Sql server 是否有一种有效的方法可以将一个表的所有行转移到另一个表,一次转移一条记录,sql-server,performance,tsql,triggers,foreach,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=((sele

要求是将所有插入的记录从一个表转移到另一个表。我用了扳机。我循环遍历所有插入的记录,并一次向新表插入一条记录,因为我必须在目标表中增加一个序列号。但是,当插入行的数量增加时,这个循环相当缓慢。有没有更好的办法

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应该可以处理并发性,但我真的认为您需要重新审视设计,例如,将seq_no设置为标识列,然后系统为您生成唯一值,并处理并发性

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

为什么seq_no不是一个标识列?另外,您是否知道,您的TOP With ORDER BY意味着SQL Server可以选择任何行,这意味着您可以跳过行?这是一个很好的问题。如果不能,您可以创建自己的临时表,将标识列初始化为max seq_no上的一列,然后从中插入,然后从临时表插入目标。但是@GilM不能处理两个用户同时运行插入的情况。表设计不能更改。因为它们被应用程序使用。这些其他应用程序如何生成新的序号值?表设计不能更改。因为它们被其他应用程序使用应用。