Копировать таблицу построчно - PullRequest
3 голосов
/ 28 января 2011

Я делаю некоторые оптимизации производительности триггера и хочу проверить это. У меня есть фактический триггер и модифицированный триггер, и я хочу на реальных данных запустить тест на старый триггер и новый триггер и сравнить его. Я хочу скопировать таблицу A в A_BCK строка за строкой. Таблица A содержит около 60 столбцов и 4000 строк, поэтому мой триггер будет выполнен 4000 раз, и я могу использовать его для теста производительности.

Я читал о курсорах, но не могу понять, как использовать курсор и переменную для построчного копирования (не выбирать в a_bck или вставлять в a_bck, выбирая из которых оба генерируют только одну вставку).

Моя процедура копирования строк на данный момент выглядит следующим образом:

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 ]

4 голосов
/ 28 января 2011

Я не часто работаю с курсорами, так что, может быть, я упускаю более простой способ ...

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 голос
/ 28 января 2011

Пример таблицы для кода ниже

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
0 голосов
/ 28 января 2011

Я бы выбрал первичный ключ вашей таблицы в вашей переменной курсора.Это однозначно определяет одну строку, которую вы можете легко выбрать:

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

Я думаю, что этот метод имеет большое преимущество в том, что его легко понять и прочитать.

...