逐行复制表

时间:2011-01-28 09:48:50

标签: sql sql-server tsql insert cursor

我正在做一些触发器性能优化,我想测试它。我有一个实际的触发器和一个修改过的触发器,我希望在实际数据上运行旧触发器和新触发器的测试并进行比较。我想逐行将表A复制到A_BCK。表A有大约60列和4000行,所以我的触发器将执行4000次,我可以用它进行性能测试。

我已经阅读过有关游标的内容,但无法弄清楚如何使用游标和变量逐行复制(不选择a_bck或插入到a_bck select中,两者都只生成一个插入)。

我现在的行复制程序如下所示:

declare @actualrow varchar(15);

DECLARE eoauz CURSOR FAST_FORWARD FOR SELECT * FROM A

open eoauz
fetch next from eoauz into @actualrow
while @@fetch_status = 0
begin
 /* INSERT INTO A_BCK VALUES FROM @actualrow  */
fetch next from eoauz into @actualrow
end
close eoauz
deallocate eoauz

当然这不起作用。我需要像行变量而不是varchar。有人可以帮助我完成任务吗?

3 个答案:

答案 0 :(得分:4)

我不经常使用游标,所以我可能会有一种更直接的方式...

SELECT TOP 0 *
INTO   #t
FROM   master..spt_values /*Create an empty table of correct schema*/

DECLARE eoauz CURSOR FAST_FORWARD FOR
  SELECT *
  FROM   master..spt_values

OPEN eoauz

INSERT INTO #t
EXEC ('fetch next from eoauz')

WHILE @@FETCH_STATUS = 0
  INSERT INTO #t
  EXEC ('fetch next from eoauz')

CLOSE eoauz

DEALLOCATE eoauz

SELECT *
FROM   #t

DROP TABLE #t

答案 1 :(得分:1)

以下代码的示例表

create table A(ID INT IDENTITY, a int, b int)
create table B(ID INT, a int, b int)
insert A select 1,2 union all select 3,4 union all select 5,6

每列需要一个变量。见下面的例子

declare @id int, @a int, @b int
DECLARE eoauz CURSOR FAST_FORWARD FOR SELECT * FROM A
open eoauz
fetch next from eoauz into @id, @a, @b
while @@fetch_status = 0
begin
 INSERT B VALUES( @id, @a, @b )
fetch next from eoauz into @id, @a, @b
end
close eoauz
deallocate eoauz

我不想使用游标,而是尽可能使用WHILE循环

declare @id int
select top 1 @id = id from A order by ID
while @@ROWCOUNT > 0 begin
    insert B select * from A where ID=@id  -- one row
    select top 1 @id = id from A where id > @id order by ID
end

答案 2 :(得分:0)

我会将你的表的主键选择到你的游标变量中。这可以唯一标识一行,然后您可以轻松选择:

declare @pk varchar(15);

DECLARE eoauz CURSOR FAST_FORWARD FOR SELECT PK FROM A

open eoauz
fetch next from eoauz into pk
while @@fetch_status = 0
begin
INSERT INTO A_BCK select * from A where PK = @pk
fetch next from eoauz into pk
end
close eoauz
deallocate eoauz

我认为这种方法在易于理解和阅读方面具有很大的优势。