Безопасно вставлять данные строки из одной таблицы в другую - SQL - PullRequest
2 голосов
/ 30 июня 2011

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

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

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

Каков наилучший подход или есть лучшая альтернатива?

Редактировать:

Мое предыдущее предложение использовать MERGE не будет работатьпоскольку я буду работать в среде SQL Server 2005, а не в 2008 году, как упоминалось ранее.

Ответы [ 2 ]

2 голосов
/ 30 июня 2011

вопрос не предоставляет никаких подробностей, поэтому я не могу предоставить фактический реальный код, только этот план атаки:

шаг 1 написать запрос, который будет ВЫБРАТЬ только те строки, которые вам нужно скопировать. Вам нужно будет JOIN и / или отфильтровать (WHERE) эти данные, чтобы включить только те строки, которые еще не существуют в целевой таблице. Сделайте список столбцов точно таким же, как столбцы таблицы назначения, в порядке столбцов и типе данных.

шаг 2 превратить этот оператор SELECT в INSERT, добавив INSERT YourDestinationTable (col1, col2, col3..) перед выбором.

шаг 3 если вы хотите попробовать только одну строку, добавьте TOP 1 к выбранной части нового INSERET - SELECT command, вы можете запускать эту команду столько раз, сколько необходимо с / без TOP, поскольку он должен исключить любые строки, добавляемые вами с помощью условий JOIN s и WHERE в SELECT

в итоге у вас будет что-то похожее на:

INSERT YourDestinationTable
        (Col1, Col2, Col3, ...)
    SELECT
        s.Col1, s.Col2, s.Col3, ...
        FROM YourSourceTable                s
            LEFT OUTER JOIN SomeOtherTable  x ON s.Col4=x.Col4
        WHERE NOT EXISTS (SELECT 1 FROM YourDestinationTable d WHERE s.PK=d.PK)
            AND x.Col5='J'

Я читаю вопрос как вставку пропущенных строк из исходной таблицы в таблицу назначения. Если изменения также необходимо перенести, перед выполнением вышеуказанных шагов вам нужно будет сделать UPDATE таблицы назначения, присоединяющейся к исходной таблице. Это трудно объяснить без дополнительной информации о реальных таблицах, столбцах и т. Д.

1 голос
/ 30 июня 2011

Да, оператор MERGE идеально подходит для массового импорта, если вы работаете с SQL Server 2008.

...