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
我想比较@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