Как я могу исправить ошибку: 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 совсем...

Другие вопросы по тегам