Я внес некоторые изменения в свою базу данных, и мне нужно перенести старые данные в новые таблицы. Для этого мне нужно заполнить таблицу (ReportOptions), взяв данные из исходной таблицы (практика), и заполнить вторую промежуточную таблицу (PracticeReportOption).
ReportOption (ReportOptionId int PK, field1, field2...)
Practice (PracticeId int PK, field1, field2...)
PracticeReportOption (PracticeReportOptionId int PK, PracticeId int FK, ReportOptionId int FK, field1, field2...)
Я сделал запрос, чтобы получить все данные, которые мне нужны для перехода от практики к ReportOptions, но мне не удается заполнить промежуточную таблицу
--Auxiliary tables
DECLARE @ReportOption TABLE (PracticeId int /*This field is not on the actual ReportOption table*/, field1, field2...)
DECLARE @PracticeReportOption TABLE (PracticeId int, ReportOptionId int, field1, field2)
--First I get all the data I need to move
INSERT INTO @ReportOption
SELECT P.practiceId, field1, field2...
FROM Practice P
--I insert it into the new table, but somehow I need to have the repation PracticeId / ReportOptionId
INSERT INTO ReportOption (field1, field2...)
OUTPUT @ReportOption.PracticeId, --> this is the field I don't know how to get
inserted.ReportOptionId
INTO @PracticeReportOption (PracticeId, ReportOptionId)
SELECT field1, field2
FROM @ReportOption
--This would insert the relationship, If I knew how to get it!
INSERT INTO @PracticeReportOption (PracticeId, ReportOptionId)
SELECT PracticeId, ReportOptionId
FROM @ReportOption
Если бы я мог ссылаться на поле, которого нет в таблице назначения в предложении OUTPUT, это было бы здорово (я думаю, что не могу, но я не знаю точно). Есть идеи о том, как удовлетворить мою потребность?
sql
sql-server
Алехандро Б.
источник
источник
OUTPUT
предложении. Поэтому, даже если вы не указываете значение для данного столбца в своемINSERT
операторе, вы все равно можете указать этот столбец вOUTPUT
предложении. Однако вы не можете возвращать переменные SQL или столбцы из других таблиц.Ответы:
Вы можете сделать это, используя
MERGE
вместо вставки:так что замените это
с участием
Ключ состоит в том, чтобы использовать предикат, который никогда не будет истинным (1 = 0) в условии поиска слияния, поэтому вы всегда будете выполнять вставку, но будете иметь доступ к полям как в исходной, так и в целевой таблицах.
Вот весь код, который я использовал для его тестирования:
Дополнительная литература и источник всего, что я знаю по этой теме, находятся здесь.
источник
Может быть, тот, кто использует MS SQL Server 2005 или ниже , найдет этот ответ полезным.
MERGE будет работать только для SQL Server 2008 или выше. В остальном я нашел другой обходной путь, который даст вам возможность создавать таблицы сопоставления.
Вот как будет выглядеть Resolution для SQL 2005:
Основная хитрость заключается в том, что мы дважды заполняем таблицу сопоставления упорядоченными данными из исходной и целевой таблицы. Дополнительные сведения см. Здесь: слияние вставленных данных с помощью OUTPUT в SQL Server 2005.
источник
Output
моиInsert
выходные данныеTable
включалиIdentity
значение из целиTable
сInsert
неактивным значением (PK) из источникаTable
(кстати, поэтому я мог бы (в другом пакете) использовать этот выводTable
для заполненияColumn
в источникTable
соIdentity
значением). Без aMerge
, я полагаю, мне пришлось бы: a) начатьTransaction
, b) перейти к следующемуIdentity
, c) вставить в tempTable
с вычисленнымIdentity
, d) установитьIdentity_Insert
, e)Insert
в цельTable
из tempTable
, f) очиститьIdentity_Insert
.