Как я могу исправить ошибку: Multi-Part ID при обновлении поля @tempTable
Я хочу сравнить @tempTable с таблицей A, если она совпадает, обновите FieldValue @tempTable, равное id таблицы A; если не совпадает, вставьте значения и получите идентификатор таблицы A для обновления FieldValue @tempTable.
Вот мой SQL-запрос:
create table [dbo].[TableA]([Id] int Indentity(1,1),[Data] [sql_variant] NULL)
declare @tempTable table (FieldValue nvarchar(1000),FieldType nvarchar(1000))
insert @tempTable values ('some content','A Type')
merge
tableA
using (
select
FieldValue
from
@tempTable
) x
on tableA.[Data] = x.FieldValue
when not matched then
insert values (x.FieldValue)
when matched then
update set x.FieldValue = tableA.[Id] ;
Ниже приведено сообщение об ошибке:
Невозможно связать многоэлементный идентификатор "x.FieldValue".
Ошибка выглядит так, как будто это разные типы данных между x.FieldValue и tableA.id, поэтому я настраиваю их на один и тот же тип данных, но он все еще не работает, и я не знаю, как это исправить.
2 ответа
Следующие могут достичь желаемых результатов.
merge
tableA
using (
select
FieldValue
from
@tempTable
) x
on tableA.[Data] = x.FieldValue
when not matched then
insert values (x.FieldValue);
update @tempTable
set t.FieldValue = i.[Id]
from @tempTable t
join TableA i ON i.[Data] = t.FieldValue
select * from @tempTable
Чего ты пытаешься достичь? Ваша целевая таблицаtableA
исходной таблицей является подзапрос с псевдонимом x.
В следующий раз, пожалуйста, попробуйте создать MCVE. Мне пришлось немного изменить ваш код, но вы получите ghist:
declare @TableA TABLE([Id] int,[Data] [sql_variant] NULL)
declare @tempTable table (FieldValue nvarchar(1000),FieldType nvarchar(1000))
insert @tempTable values ('some content','A Type');
merge
@tableA a
using (
select
FieldValue
from
@tempTable
) x
on a.[Data] = x.FieldValue
when matched then
update set a.id = x.FieldValue; --fields swapped, probably not really your intention...
Дело в том, что ваш код пытается обновить поле вашей исходной таблицы. Общая идея MERGE
является
- Мы нацелены на одну таблицу, в которую мы хотим вставить / обновить / удалить некоторые записи.
- Мы используем второй набор с данными, которые мы хотим сравнить и использовать для этих операций
- Мы находим строки в источнике, которые отсутствуют в цели ->
INSERT
- Мы находим строки в источнике, которые существуют в цели ->
UPDATE
- Мы находим строки внутри цели, которые отсутствуют в источнике ->
DELETE
Говоря об этом, я сомневаюсь, что приведенный выше код понадобится MERGE
совсем...