Sql server MERGE语句包含多部分标识符
我编写了以下合并指令:Sql server MERGE语句包含多部分标识符,sql-server,tsql,merge,Sql Server,Tsql,Merge,我编写了以下合并指令: MERGE INTO dbo.sperradressen WITH (HOLDLOCK) AS target USING (SELECT dbo.f010.*, ISNULL(land.iso2,0) iso2land FROM dbo.f010 LEFT JOIN dbo.land ON dbo.f010.firma = land.firma AND dbo.f010.land = db
MERGE INTO dbo.sperradressen WITH (HOLDLOCK) AS target
USING (SELECT dbo.f010.*, ISNULL(land.iso2,0) iso2land
FROM dbo.f010
LEFT JOIN dbo.land ON dbo.f010.firma = land.firma
AND dbo.f010.land = dbo.land.nr
AND dbo.land.unr = 0) AS source
ON target.ref_table ='f010' AND target.ref_key = source.key_1
WHEN MATCHED AND (target.name1 != source.name1 COLLATE Latin1_General_CS_AS OR
target.name2 != source.name2 COLLATE Latin1_General_CS_AS OR
target.name3 != source.name3 COLLATE Latin1_General_CS_AS OR
target.strasse != source.str COLLATE Latin1_General_CS_AS OR
target.plz != source.plz COLLATE Latin1_General_CS_AS OR
target.stadt != source.ort COLLATE Latin1_General_CS_AS OR
target.land != source.iso2land)
THEN
UPDATE
SET target.name1 = source.name1,
target.name2 = source.name2,
target.name3 = source.name3,
target.strasse = source.str,
target.plz = source.plz,
target.stadt = source.ort,
target.land = source.iso2land,
target.eusanktstatus = 0,
target.hhupd = '${hhupd}',
target.eusanktinfo = '',
target.info = '',
target.firstname = '',
target.middlename = '',
target.lastname = '',
target.wholename = '',
target.street = '',
target.zipcode = '',
target.city = '',
target.country = ''
WHEN NOT MATCHED BY TARGET THEN
INSERT (target.name1, target.name2, target.name3, target.strasse, target.plz, target.stadt, target.land, target.hhupd)
VALUES (source.name1, source.name2, source.name3,
source.str, source.plz, source.ort, source.iso2land, '${hhupd}')
WHEN NOT MATCHED BY SOURCE THEN
DELETE;
这一个工作得很好,所以我想创建第二个
MERGE INTO dbo.sperradressen WITH (HOLDLOCK) AS target
USING (SELECT dbo.f012.*, ISNULL(land.iso2,0) iso2land FROM dbo.f012
INNER JOIN f010 ON f010.firma = f012.firma AND f010.sa = f012.sa AND f010.konto = f012.konto
LEFT JOIN dbo.land on dbo.f012.firma = land.firma AND dbo.land.unr = 0 )
AS source
ON target.ref_table ='f012' AND target.ref_key = source.key_1
WHEN MATCHED AND (target.name1 != source.nachname OR
target.name2 != source.vorname OR
target.name3 != source.adr_zusatz OR
target.strasse != source.str OR
target.plz != f010.plz OR
target.stadt != f010.ort OR
target.land != source.iso2land)
THEN
UPDATE SET
target.name1 = source.nachname,
target.name2 = source.vorname,
target.name3 = source.adr_zusatz,
target.strasse = f010.str,
target.plz = f010.plz,
target.stadt = f010.ort,
target.land = source.iso2land,
target.eusanktstatus = 0,
target.hhupd = '${hhupd}',
target.eusanktinfo = '',
target.info = '',
target.firstname = '',
target.middlename = '',
target.lastname = '',
target.wholename = '',
target.street = '',
target.zipcode = '',
target.city = '',
target.country = ''
WHEN NOT MATCHED BY TARGET THEN
INSERT (target.name1, target.name2, target.name3,target.strasse,target.plz,target.stadt, target.land, target.hhupd)
VALUES (source.nachname, source.vorname, source.adr_zusatz,f010.str,f010.plz,f010.ort,source.iso2land, '${hhupd}')
WHEN NOT MATCHED BY SOURCE THEN
DELETE;
下面是来自SQL Server的错误消息:
MERGE语句中使用的插入列列表不能包含多部分标识符。改用单部件标识符
它清楚地用f010封装零件
所以这一定是错误所在。
但是,当我查看原始更新脚本时,我不得不这样使用它,因为不同表的列属性不同。
下面是原始脚本:
UPDATE sperradressen
SET Adress.name1 = f012.nachname,
sperradressen.name2 = f012.vorname,
sperradressen.name3 = f012.adr_zusatz,
sperradressen.strasse = f010.str,
sperradressen.plz = f010.plz,
sperradressen.stadt = f010.ort,
sperradressen.land = land.iso2,
sperradressen.eusanktstatus = 0,
sperradressen.hhupd = '${hhupd}',
sperradressen.eusanktinfo = '',
sperradressen.info = '',
sperradressen.firstname = '',
sperradressen.middlename = '',
sperradressen.lastname = '',
sperradressen.wholename = '',
sperradressen.street = '',
sperradressen.zipcode = '',
sperradressen.city = '',
sperradressen.country = ''
FROM f012
INNER JOIN f010 ON ( f010.firma = f012.firma AND f010.sa = f012.sa AND f010.konto = f012.konto )
INNER JOIN land ON ( f010.firma = land.firma AND f010.land = land.nr AND land.unr = 0 )
WHERE f012.firma = ${TBR}
AND f012.anr = 00000000
AND f012.key_1 = sperradressen.key_1
AND (sperradressen.name1 != f012.nachname
OR sperradressen.name2 != f012.vorname
OR sperradressen.name3 != f012.adr_zusatz
OR sperradressen.strasse != f010.str
OR sperradressen.plz != f010.plz
OR sperradressen.stadt != f010.ort
OR sperradressen.land != land.iso2);
现在如何获得正确的单件标识符
target.strasse != source.str OR
target.plz != f010.plz OR
target.stadt != f010.ort OR
这是红色下划线,但如何使其工作?您只能插入到目标表中,因此别名是多余的,实际上SQL Server不允许这样做。对此进行更改:
INSERT(target.name1、target.name2、target.name3。。。
为此:
插入(名称1、名称2、名称3。。。
您只能插入到目标表中,因此别名是多余的,实际上SQL Server不允许这样做。更改如下:
INSERT(target.name1、target.name2、target.name3。。。
为此:
插入(名称1、名称2、名称3。。。
在INSERT语句中,您指定的是f010表中的值。这是不允许的,您应该将它们添加到源表中
大概是这样的:
MERGE INTO dbo.sperradressen WITH (HOLDLOCK) AS target
USING (SELECT dbo.f012.*, ISNULL(land.iso2,0) iso2land, f010.str,f010.plz,f010.ort
FROM dbo.f012
INNER JOIN f010 ON f010.firma = f012.firma AND f010.sa = f012.sa AND f010.konto = f012.konto
LEFT JOIN dbo.land on dbo.f012.firma = land.firma AND dbo.land.unr = 0 )
AS source
ON target.ref_table ='f012' AND target.ref_key = source.key_1
WHEN MATCHED AND (target.name1 != source.nachname OR
target.name2 != source.vorname OR
target.name3 != source.adr_zusatz OR
target.strasse != source.str OR
target.plz != f010.plz OR
target.stadt != f010.ort OR
target.land != source.iso2land)
THEN
UPDATE SET
target.name1 = source.nachname,
target.name2 = source.vorname,
target.name3 = source.adr_zusatz,
target.strasse = f010.str,
target.plz = f010.plz,
target.stadt = f010.ort,
target.land = source.iso2land,
target.eusanktstatus = 0,
target.hhupd = '${hhupd}',
target.eusanktinfo = '',
target.info = '',
target.firstname = '',
target.middlename = '',
target.lastname = '',
target.wholename = '',
target.street = '',
target.zipcode = '',
target.city = '',
target.country = ''
WHEN NOT MATCHED BY TARGET THEN
INSERT (name1, name2, name3,strasse,plz,stadt, land, hhupd)
VALUES (source.nachname, source.vorname, source.adr_zusatz,source.str,source.plz,source.ort,source.iso2land, '${hhupd}')
WHEN NOT MATCHED BY SOURCE THEN
DELETE;
在INSERT语句中,您指定的是f010表中的值。这是不允许的,您应该将它们添加到源表中 大概是这样的:
MERGE INTO dbo.sperradressen WITH (HOLDLOCK) AS target
USING (SELECT dbo.f012.*, ISNULL(land.iso2,0) iso2land, f010.str,f010.plz,f010.ort
FROM dbo.f012
INNER JOIN f010 ON f010.firma = f012.firma AND f010.sa = f012.sa AND f010.konto = f012.konto
LEFT JOIN dbo.land on dbo.f012.firma = land.firma AND dbo.land.unr = 0 )
AS source
ON target.ref_table ='f012' AND target.ref_key = source.key_1
WHEN MATCHED AND (target.name1 != source.nachname OR
target.name2 != source.vorname OR
target.name3 != source.adr_zusatz OR
target.strasse != source.str OR
target.plz != f010.plz OR
target.stadt != f010.ort OR
target.land != source.iso2land)
THEN
UPDATE SET
target.name1 = source.nachname,
target.name2 = source.vorname,
target.name3 = source.adr_zusatz,
target.strasse = f010.str,
target.plz = f010.plz,
target.stadt = f010.ort,
target.land = source.iso2land,
target.eusanktstatus = 0,
target.hhupd = '${hhupd}',
target.eusanktinfo = '',
target.info = '',
target.firstname = '',
target.middlename = '',
target.lastname = '',
target.wholename = '',
target.street = '',
target.zipcode = '',
target.city = '',
target.country = ''
WHEN NOT MATCHED BY TARGET THEN
INSERT (name1, name2, name3,strasse,plz,stadt, land, hhupd)
VALUES (source.nachname, source.vorname, source.adr_zusatz,source.str,source.plz,source.ort,source.iso2land, '${hhupd}')
WHEN NOT MATCHED BY SOURCE THEN
DELETE;
f012.firma=${TBR}
不是有效的t-SQL,我希望首先出现错误。f012.firma=${TBR}
无效的t-SQL,我希望首先会出现错误。好吧,我已经调整了,但问题仍然存在。@EasyGer没有两部分名称时,您不会在两部分名称上出现错误。您尝试了什么查询?您是否在其他地方使用了两部分名称?不。这都是我编写的。可能连接不正确吗?但它已交付如果我单独使用它,结果。好吧,我已经调整了这个,但问题仍然存在。@EasyGer当没有两部分名称时,关于两部分名称不会出现错误。你尝试了什么查询?你在其他地方使用了两部分名称吗?没有。这都是我写的。可能连接不正确吗?但是如果我单独使用它,它会提供结果。