Другой способ, который мы использовали в прошлом, - это создать временную таблицу с первичными ключами, которые мы хотим переместить и использовать в цикле while. Таким образом, вы можете сделать это в виде блочной моды, чтобы избежать больших накладных расходов транзакции, если вы отменили ее и пришлось откатиться.
В основном то, что вы в итоге делаете, это вставка в имя таблицы (...) выбор (...) из имени таблицы, в которой находится первичный ключ (выберите топ 10000 ключ из временного)
верхние 10000, которые вы хотите во вторичном наборе результатов, чтобы вы могли удалить их из временной таблицы, чтобы они больше не обрабатывались.
Еще одним способом было бы использование курсоров для уменьшения количества записей, которые вы обрабатываете за раз.
Другой метод цикла - сделать что-то подобное в цикле while.
объявить @stop как int
set @stop = (выберите count (primaryKey) из tableName, где primaryKey отсутствует в файле destinstiontable)
while (@stop> 0)
начать транзакцию
вставить в destinationTable (...)
выберите (...) из исходной таблицы, где не указан primaryKey (выберите основной ключ из назначения)
совершить
set @stop = (выберите count (primaryKey) из tableName, где primaryKey отсутствует в destinstiontable)
конец
Не самый эффективный, но он сработает и должен позволить вам вести журнал транзакций. Если вам не нужно это, обязательно используйте ключевое слово no lock, чтобы не блокировать другие транзакции при выполнении этого большого перемещения (если только вы не используете BCP или DTS, так как они намного быстрее).
Хотя, кое-что из сказанного, вероятно, является вашей лучшей ставкой. Используйте BCP, DTS или другой инструмент для массовых операций. Если вы можете удалить индексы, это заставит дела идти намного быстрее.