Как сделать пакет INSERT SQL Server? - PullRequest
0 голосов
/ 24 января 2020

Я пытаюсь пакетно вставить строки из одной таблицы в другую.

DECLARE @batch INT = 10000;

WHILE @batch > 0
BEGIN
BEGIN TRANSACTION

    INSERT into table2
    select top (@batch) *
    FROM table1

    SET @batch = @@ROWCOUNT

COMMIT TRANSACTION

END

Он работает на первых 10000 и вставляет их. Затем я получаю сообщение об ошибке «Не удается вставить дубликат ключа», в котором он пытается вставить тот же первичный ключ, поэтому я предполагаю, что он пытается повторить тот же пакет. Какой лог c я пропускаю здесь, чтобы l oop через партии? Возможно, что-то простое, но я не могу понять.

Кто-нибудь может помочь? спасибо

Ответы [ 2 ]

1 голос
/ 24 января 2020

Ваш код продолжает вставлять одни и те же строки. Вы можете избежать этого, "разбивая на страницы" ваши вставки:

DECLARE @batch INT = 10000;
DECLARE @page INT = 0
DECLARE @lastCount INT = 1

WHILE @lastCount > 0
BEGIN
BEGIN TRANSACTION

    INSERT into table2
    SELECT col1, col2, ... -- list columns explicitly
    FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY YourPrimaryKey ) AS RowNum, *
              FROM      table1
            ) AS RowConstrainedResult
    WHERE   RowNum >= (@page * @batch) AND RowNum < ((@page+1) * @batch)
    SET @lastCount = @@ROWCOUNT
    SET @page = @page + 1

COMMIT TRANSACTION

END
1 голос
/ 24 января 2020

Вам нужен какой-то способ устранения существующих строк. Кажется, у вас есть первичный ключ, поэтому:

INSERT into table2
   SELECT TOP (@batch) *
   FROM table1 t1
   WHERE NOT EXISTS (SELECT 1 FROM table2 t2 WHERE t2.id = t1.id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...