【问题标题】:Combining fields at the same level in XML Path在 XML Path 中组合同一级别的字段
【发布时间】:2014-01-21 15:16:10
【问题描述】:

我正在尝试将以下 XML 生成为表格的一列:

<root>
    <Address1>
        <Addressline1>Test Road</Addressline1>
        <Addressline2>Test Street</Addressline2>
        <Addressline3>Test Town</Addressline3>
        <Addressline4>Test State</Addressline4>
        <Postcode>Test Postcode</Postcode>
    </Address1>
    <Address2>
        <Addressline1>Test Road</Addressline1>
        <Addressline2>Test Street</Addressline2>
        <Addressline3>Test Town</Addressline3>
        <Addressline4>Test State</Addressline4>
        <Postcode>Test Postcode</Postcode>
    </Address2>
</root>

下面的 SQL 差不多了:

select  (1Addressline1,
        1Addressline2,
        1Addressline3,
        1Addressline4,
        1Postcode for xml path('Address'), root('Addresses')) AS Address1,
        (2Addressline1,
        2Addressline2,
        2Addressline3,
        2Addressline4,
        2Postcode for xml path('Address'), root('Addresses')) AS Address2,
        ColumnA
        ColumnB
        ColumnC
From    Addresses

生成以下 XML:

<root>
    <Address1>
        <Addressline1>Test Road</Addressline1>
        <Addressline2>Test Street</Addressline2>
        <Addressline3>Test Town</Addressline3>
        <Addressline4>Test State</Addressline4>
        <Postcode>Test Postcode</Postcode>
    </Address1>
</root>,    
<root>
    <Address2>
        <Addressline1>Test Road</Addressline1>
        <Addressline2>Test Street</Addressline2>
        <Addressline3>Test Town</Addressline3>
        <Addressline4>Test State</Addressline4>
        <Postcode>Test Postcode</Postcode>
    </Address2>
</root>,    
ColumnA,
ColumnB,
ColumnC

生成两个单独的 XML 列是不正确的。我现在需要像上面那样在根节点下组合地址 1 和地址 2,但无法解决或找到正确的语法。

编辑:正如我所建议的,我已将我的代码修改为此给出了一些语法错误:

SELECT      ColumnA,
            ColumnB,
            ColumnC,

            (
                select
                (
                    (
                        select      RTRIM(Address1Line1),
                                    RTRIM(Address1Line2),
                                    RTRIM(Address1Line3),
                                    RTRIM(Address1Line4),
                                    RTRIM(Address1Line5) 
                        for xml path('Address'), type
                    ),
                    (
                        select      RTRIM(Address2Line1),
                                    RTRIM(Address2Line2),
                                    RTRIM(Address2Line3),
                                    RTRIM(Address2Line4),
                                    RTRIM(Address2Line5)
                        for xml path('Address'), type
                    )
                ) FOR XML PATH(''), root('Addresses'),type
            ) AS Addresses

FROM        TableA

【问题讨论】:

    标签: sql sql-server for-xml-path


    【解决方案1】:
    DECLARE @Addresses TABLE 
    (AddressNumber INT, Addressline1 VARCHAR(50),Addressline2 VARCHAR(50)
    ,Addressline3 VARCHAR(50),Addressline4 VARCHAR(50),PostCode VARCHAR(50))
    
    INSERT INTO @Addresses VALUES 
    (1,'Add 1 Addressline1', 'Add 1 Addressline2', 'Add 1 Addressline3', 'Add 1 Addressline4', 'ABCD132'),
    (2,'Add 2 Addressline1', 'Add 2 Addressline2', 'Add 2 Addressline3', 'Add 2 Addressline4', 'JKLM132'),
    (3,'Add 3 Addressline1', 'Add 3 Addressline2', 'Add 3 Addressline3', 'Add 3 Addressline4', 'RTPZ132'),
    (4,'Add 4 Addressline1', 'Add 4 Addressline2', 'Add 4 Addressline3', 'Add 4 Addressline4', 'XMLO132')
    
    
    select   AddressNumber [@AddressID]
            ,Addressline1
            ,Addressline2
            ,Addressline3
            ,Addressline4
            ,PostCode
    FROM    @Addresses 
    for xml PATH('Address'),Elements , root('PatientAddress') 
    

    结果集

    <PatientAddress>
      <Address AddressID="1">
        <Addressline1>Add 1 Addressline1</Addressline1>
        <Addressline2>Add 1 Addressline2</Addressline2>
        <Addressline3>Add 1 Addressline3</Addressline3>
        <Addressline4>Add 1 Addressline4</Addressline4>
        <PostCode>ABCD132</PostCode>
      </Address>
      <Address AddressID="2">
        <Addressline1>Add 2 Addressline1</Addressline1>
        <Addressline2>Add 2 Addressline2</Addressline2>
        <Addressline3>Add 2 Addressline3</Addressline3>
        <Addressline4>Add 2 Addressline4</Addressline4>
        <PostCode>JKLM132</PostCode>
      </Address>
      <Address AddressID="3">
        <Addressline1>Add 3 Addressline1</Addressline1>
        <Addressline2>Add 3 Addressline2</Addressline2>
        <Addressline3>Add 3 Addressline3</Addressline3>
        <Addressline4>Add 3 Addressline4</Addressline4>
        <PostCode>RTPZ132</PostCode>
      </Address>
      <Address AddressID="4">
        <Addressline1>Add 4 Addressline1</Addressline1>
        <Addressline2>Add 4 Addressline2</Addressline2>
        <Addressline3>Add 4 Addressline3</Addressline3>
        <Addressline4>Add 4 Addressline4</Addressline4>
        <PostCode>XMLO132</PostCode>
      </Address>
    </PatientAddress>
    

    【讨论】:

    • 这就是我想要的。问题是表有两组地址列:
    【解决方案2】:

    只需将文字替换为表中列的名称即可:

    select
    (SELECT '1' addressline1,'2' addressline2, '3' addressline3, '4' addressline4, 'PC' postcode for xml path('Address1'), type ),
    (SELECT '21' addressline1,'22' addressline2, '23' addressline3, '24' addressline4, '2PC' postcode for xml path('Address2'), type  )
    FOR XML PATH(''), root('PatientAddress'),type
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-03
      • 2022-06-14
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多