我想将@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之间的数据类型不同,因此我将它们调整为相同的数据类型,但仍然无法正常工作,而且我不知道如何解决。
答案 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