powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Перенес данных по порциям
7 сообщений из 7, страница 1 из 1
Перенес данных по порциям
    #40086504
sysn1k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Представим, что есть таблица на миллион строк . Нужно перенести эти данные в другую таблицу (удалить строки из исходной и передать их в новую). Мы можем передавать только по 10 тыс строк. Джойны и привязка к дате запрещена (примерный вид таблицы предоставил).
Столбцы ([date] , [udfname]) - первичные ключи.

Пытался через CTE. Создаю временную таблицу. Туда вставляем наш TOP из исходной таблицы. Как вставил эти данные во временную таблицу, то сразу же вызываем delete и убираем этот TOP из первой табл.
Код: sql
1.
2.
3.
4.
5.
6.
with a as (
	select top 100 *
	from [нужная_тябл]
	)
insert  [временная_табл] ([нужные_столбцы])
select * from a



Но данный способ не работает (работает есть только выбрать insert или delete), т.к. в одном CTE нельзя вызвать несколько DDL команд, ругается на синтаксис запроса.
По отдельности TOP мы не можем вызвать, т.к он выбирает рандомные значения и соответственно удалятся данные не из первого CTE.

Другой вариант - это добавить новый столбец, который каждый строке даст уникальный идентификатор. Потом я вспомнил, что таблица уже имеет первичные ключи и соответственно эта таблица отсортирована.

Могу ли я с чистой душой использовать TOP 10000 без условий для INSERT и потом для DELETE?
...
Рейтинг: 0 / 0
Перенес данных по порциям
    #40086506
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
declare @rc int =1;

while @rc > 0 begin

   delete top(10000) t
     output deleted.* into [ в новую]
     from [из исходной] as t
   ;
   set @rc = @@rowcount;

end;
...
Рейтинг: 0 / 0
Перенес данных по порциям
    #40086507
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sysn1k
в одном CTE нельзя вызвать несколько DDL команд


sysn1k
Могу ли я с чистой душой использовать TOP 10000 без условий для INSERT и потом для DELETE?

можно объединить "приятное с полезным" )

Код: sql
1.
2.
3.
4.
insert into [временная_табл] ([нужные_столбцы])
select [нужные_столбцы]
from (
  delete top(10000) from [нужная_тябл] output deleted.*) t
...
Рейтинг: 0 / 0
Перенес данных по порциям
    #40086509
sysn1k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222,

да, вариант про deleted забыл написать. Но я думал, что он применяется только для триггеров. Поэтому не стал пробовать. Видимо зря.
...
Рейтинг: 0 / 0
Перенес данных по порциям
    #40086550
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
court,

Извращение же!
Вариант aleks222 получше, правда, я бы цикл выкинул, написал бы просто go 999, ну, или сколько там нужно итераций
...
Рейтинг: 0 / 0
Перенес данных по порциям
    #40086557
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Критик,

а "into [ в новую]", в цикле, "ниразу" не смущает ?
...
Рейтинг: 0 / 0
Перенес данных по порциям
    #40086757
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
court,

дык тут конструкция into не создает таблицу, так что да, в цикле )
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Перенес данных по порциям
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]