Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server MERGE语句包含多部分标识符_Sql Server_Tsql_Merge - Fatal编程技术网

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当没有两部分名称时,关于两部分名称不会出现错误。你尝试了什么查询?你在其他地方使用了两部分名称吗?没有。这都是我写的。可能连接不正确吗?但是如果我单独使用它,它会提供结果。