Как я могу исправить ошибку: Multi-Part ID при обновлении поля @tempTable - PullRequest
0 голосов
/ 13 февраля 2019

Я хочу сравнить @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 ]

0 голосов
/ 14 февраля 2019

Следующие могут достичь желаемых результатов.

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
0 голосов
/ 13 февраля 2019

Чего ты пытаешься достичь?Ваша целевая таблица равна 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 вообще ...

...