Извлекать строки в пакетах из таблицы / таблиц в гарантированном порядке в SQL Server 2016 - PullRequest
0 голосов
/ 17 октября 2018

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

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

SELECT * FROM dbo.${batch.name}
        ORDER BY created_date
        OFFSET ${batch.offset} ROWS
        FETCH NEXT ${batch.batchSize} ROWS ONLY;

Но позже я понимаю, что есть некоторые таблицы, в которых нет столбца create_date.

Согласно SQL-серверу порядок не гарантируется, если вы не укажете явный порядок по предложению.Поэтому я не могу удалить порядок по, но так как созданный_дат не во всех таблицах, этот запрос не будет выполнен.

Существует ли универсальный запрос выбора, который может вернуть мне строки в порядке, учитывая, что все таблицы неиметь общий столбец для порядка по предложению ИЛИ Любой запрос, который может вернуть строки в порядке вставки?

Будет ли работать следующий запрос?Что, если во время выполнения этой пакетной утилиты было добавлено больше строк, используя следующий запрос?

SELECT * FROM dbo.${batch.name}
            ORDER BY (SELECT 1)
            OFFSET ${batch.offset} ROWS
            FETCH NEXT ${batch.batchSize} ROWS ONLY;

Спасибо.

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

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

SELECT * FROM dbo.${batch.name}
        ORDER BY ${batch.orderByColumn}
        OFFSET ${batch.offset} ROWS
        FETCH NEXT ${batch.batchSize} ROWS ONLY;

Спасибо @ Шону Ланге и @ Джейсон А. Лонг за ваш ответ.

0 голосов
/ 17 октября 2018

Порядка вставки не существует.По определению таблица является неупорядоченным множеством.Заказ происходит только тогда, когда вы заказываете свой набор результатов.Так что нет, то, что вы хотите, не возможно.Что еще хуже, вы можете подумать, что это так, потому что обычно они возвращают их в порядке кластерного индекса ... до тех пор, пока вдруг это не произойдет.

https://blogs.msdn.microsoft.com/conor_cunningham_msft/2008/08/27/no-seatbelt-expecting-order-without-order-by/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...