How can I fix the error : Multi-Part ID when update a field of @tempTable

How can I fix the error : Multi-Part ID when update a field of @tempTable

我想比较@tempTable和tableA,如果匹配则更新@tempTable的FieldValue等于tableA的id;如果不匹配则插入值,并获取 tableA 的 id 以更新@tempTable 的 FieldValue。

以下是我的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] ;

错误信息如下:

Unable to tie the Multi-Part ID "x.FieldValue".

报错好像是x.FieldValue和tableA.id的数据类型不一样,所以我把它们调整成相同的数据类型,还是不行,不知道怎么办修复它。

你想达到什么目的?您的 目标 table 是 tableA,您的 源 table 是 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...

重点是: 您的代码试图更新您的 source table 的字段。 MERGE的大意是

  • 我们定位一个 table 我们想要 insert/update/delete 一些记录。
  • 我们将第二组数据与我们要比较并用于这些操作的数据一起使用
  • 我们在源中找到目标中缺失的行-> INSERT
  • 我们在源中找到目标中存在的行-> UPDATE
  • 我们在目标 中找到了源中缺失的行 -> DELETE

这么说,我怀疑上面的代码根本不需要 MERGE...

下面可以达到我想要的效果

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