В приведенном выше случае @Thomas имеет вполне работоспособное решение. Однако иногда люди упрощают вопрос, чтобы задать вопрос, поэтому я расскажу о том, что вы, возможно, захотите сделать, если вам нужно перейти ко многим таблицам (или, например, в первой таблице нет уникальных ограничений на имя), а не просто два.
Сначала я вставлю данные в промежуточную таблицу и добавлю столбец для идентификатора, который будет нулевым. Затем я написал бы вставку в родительскую таблицу, используя предложение OUTPUT для вывода идентификаторов и естественного ключа в табличную переменную. Затем я бы использовал переменную таблицы для обновления поля id в промежуточной таблице. Затем я вставлял записи из промежуточной таблицы в другие таблицы. Поскольку у меня теперь есть идентификатор, больше нет необходимости обращаться к исходной родительской таблице. (Если количество записей велико, я мог бы также проиндексировать промежуточную таблицу).
Теперь, если у вас нет естественного ключа, процесс усложняется, потому что у вас нет способа определить, какая запись кому идет. Затем я обычно добавляю идентификатор в промежуточную таблицу, а затем выполняю первоначальный импорт в родительскую таблицу по одной записи за раз (включая stagingtableid в качестве переменной в курсоре), а затем обновляю промежуточную таблицу, используя каждый идентификатор родительской таблицы, как есть. создано. После обновления всех исходных записей я использую основанные на множестве процессы для вставки или обновления других таблиц.
Промежуточная таблица также дает вам возможность локально исправить любые неверные данные, прежде чем пытаться поместить их в рабочие таблицы.
Другой синтаксис, который вам может понадобиться знать, если что-то сложное или повторяющийся процесс - это утверждение MERGE. Он будет вставлен, если это новая запись, и обновит, если это существующая запись.
Если это очень сложное преобразование, вы можете рассмотреть возможность использования служб SSIS.