合并时不匹配来源和

hub*_*ber 7 xml sql-server

我有一个表'groups',里面有一些数据:

groupid     groupname       grouptext
1           Cars            Toyota
2           Cars            BMW
3           Cars            Renault
4           Bikes           BMW
5           Bikes           Yamaha
Run Code Online (Sandbox Code Playgroud)

之后,我是以下SQL语句,其中我尝试使用MERGE语句更新groups表.我想要做的是使用XML中的数据更新groups表.但我还想删除表中其组名存在于XML中的所有条目.因此,例如在执行后,我的表应该如下所示

groupid     groupname       grouptext
1           Cars            Audi
4           Bikes           BMW
5           Bikes           Yamaha
6           Singers         Lady Gaga
Run Code Online (Sandbox Code Playgroud)

因为,有组名,汽车在那里,所有的汽车应该从表中删除.现在,当我使用WHEN NOT MATCHED BY SOURCE AND子句时,我收到此错误:

Msg 5334, Level 16, State 2, Line 60
The identifier 's.groupname' cannot be bound. Only target columns and columns in the clause scope are allowed in the 'WHEN NOT MATCHED BY SOURCE' clause of a MERGE statement.
Msg 5334, Level 16, State 2, Line 61
The identifier 's.grouptext' cannot be bound. Only target columns and columns in the clause scope are allowed in the 'WHEN NOT MATCHED BY SOURCE' clause of a MERGE statement.
Run Code Online (Sandbox Code Playgroud)

我的问题是,如何使用以下代码实现所需的结果:

DECLARE @UpdateXml Xml = N'<groups>
    <group>
        <groupid>1</groupid>
        <groupname>Cars</groupname>
        <grouptext>Audi</grouptext>
    </group>
    <group>
        <groupid>0</groupid>
        <groupname>Singers</groupname>
        <grouptext>Lady Gaga</grouptext>
    </group>
</groups>';

DECLARE @hDoc INT;
EXEC sp_xml_preparedocument @hDoc OUTPUT, @UpdateXml;

MERGE INTO groups AS t
USING
(
    SELECT groupid, groupname, grouptext
    FROM OPENXML(@hdoc, '/groups/group', 1)
    WITH
    (
        groupid INT 'groupid',
        groupname VARCHAR(50) 'groupname',
        grouptext VARCHAR(100) 'grouptext'
    )
) AS source(groupid, groupname, grouptext)

ON
    t.groupid = source.groupid AND
    t.groupname = source.groupname

WHEN MATCHED THEN
UPDATE SET
    groupname = source.groupname,
    grouptext = source.grouptext

WHEN NOT MATCHED BY TARGET THEN
    INSERT (groupname, grouptext)
    VALUES (source.groupname, source.grouptext)

WHEN NOT MATCHED BY SOURCE AND
    s.groupname = t.groupname AND
    s.grouptext = t.grouptext
        THEN
            delete
;
Run Code Online (Sandbox Code Playgroud)

小智 11

MERGE语句中没有匹配的SOURCE子句时,只有TARGET表中的列除外.您可以使用SubQuery,例如:

WHEN NOT MATCHED BY SOURCE AND
    t.groupname IN (SELECT s.groupname FROM table_name where xyz_condition)
Run Code Online (Sandbox Code Playgroud)

  • 但为什么?为什么存在这个限制 (3认同)
  • @PeteAlvin 可能在一年后不相关,但存在限制,因为 s _wasn 不匹配。_ 在最初的问题中,在 WHEN NOT MATCHED BY SOURCE 下, s.groupname 的值是什么健康)状况?它可能是来自“source”的任何值,在这种情况下,这个“IN”子句正确地模拟了逻辑。 (2认同)