如何解决错误:更新@tempTable

时间:2019-02-13 02:01:35

标签: sql-server tsql sql-server-2008 merge sql-merge

我想将@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] ;

以下是错误消息:

  

无法绑定多部件ID“ x.FieldValue”。

该错误似乎是x.FieldValue和tableA.id之间的数据类型不同,因此我将它们调整为相同的数据类型,但仍然无法正常工作,而且我不知道如何解决。

2 个答案:

答案 0 :(得分:1)

您要达到什么目标?您的目标表是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 ...

答案 1 :(得分:1)

以下可以达到我想要的结果。

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