【问题标题】:Best way to generate XML using TSQL使用 SQL 生成 XML 的最佳方法
【发布时间】:2015-06-10 01:24:10
【问题描述】:

下面的代码在很多级别上都是错误的,我无法全部列出。 我想任何试图回答这个问题的人都只会使用测试数据表。哈!

我拼凑了几篇文章,在 EXPLICIT、RAW 和 PATH 之间来回切换,结果有点多。

我认为经常使用 SQL 生成 XML 的人会知道这一点。

我对 Ex、Raw 或 Path 没有偏好 - 我只需要最适合这项工作的工具。最终,将有 65 列组成最终文档的各个级别。

我需要代码来查询该表并生成它:

<batchContactList>
    <contact contactID="123" action="AddOrModify">
        <contactField name="FirstName">Johnny</contactField>
        <contactField name="LastName">Testguy</contactField>
        <contactPointList>
            <contactPoint type="Email">
            <contactPointField name="Label">Email</contactPointField>
            <contactPointField name="Address">example@sendwordnow.com</contactPointField>
                </contactPoint>
             </contactPointList>
    </contact>
</batchContactList>

测试代码

--测试数据

DECLARE @tvTest TABLE (contactID INT, FirstName VARCHAR(25), LastName VARCHAR(25), [type] VARCHAR(25), [address] VARCHAR(25))
INSERT INTO @tvTest (contactID, FirstName, LastName, [type], [address])
SELECT 123, 'Johnny', 'Testguy', 'email', 'example@sendwordnow.com'
UNION
SELECT 321, 'Sally', 'Testgirl', 'email', '1example@sendwordnow.com';

--Outer
SELECT
      A.contactID AS "@contactID"
    , 'AddOrModify' AS "@action"
FROM 
    @tvTest A
FOR XML PATH('contact'), ROOT('batchContactList')

--Level 1
DECLARE @xmldata XML;
SELECT @xmldata = (SELECT contactID, FirstName, LastName FROM @tvTest FOR XML PATH (''));

SELECT
      ColumnName AS "@name"
    , ColumnValue AS "text()"
FROM
    (SELECT 
          i.value('local-name(.)','varchar(100)') ColumnName
        , i.value('.','varchar(100)') ColumnValue
    FROM 
        @xmldata.nodes('//*[text()]') x(i)) tmp
FOR XML PATH ('contactField'), ROOT('contact')

SELECT @xmldata = (SELECT contactID, [type], [address] FROM @tvTest FOR XML PATH (''));

--Level 2, not complete
SELECT
      ColumnName AS "@name"
    , ColumnValue AS "text()"
FROM
    (SELECT 
          i.value('local-name(.)','varchar(100)') ColumnName
        , i.value('.','varchar(100)') ColumnValue
    FROM 
        @xmldata.nodes('//*[text()]') x(i)) tmp
FOR XML PATH ('contactPoint'), ROOT('contactPointList')

【问题讨论】:

    标签: sql-server xml tsql


    【解决方案1】:

    我总是使用 PATH。

    这样的东西应该会给你你想要的。

    select T.contactID as [@contactID],
           'AddOrModify' as [@Action],
           'FirstName' as [contactField/@name],
           T.FirstName as [contactField],
           null,
           'LastName' as [contactField/@name],
           T.LastName as [contactField],
           (
           select 'Email' as [contactPoint/@type],
                  'Label' as [contactPointField/@name],
                  T.type as [contactPointField],
                  null,
                  'Address' as [contactPointField/@name],
                  T.address as [contactPointField]
           for xml path('contactPointList'), type
           )
    from @tvTest as T
    for xml path('contact'), root('catchContactList')
    

    结果:

    <catchContactList>
      <contact contactID="123" Action="AddOrModify">
        <contactField name="FirstName">Johnny</contactField>
        <contactField name="LastName">Testguy</contactField>
        <contactPointList>
          <contactPoint type="Email" />
          <contactPointField name="Label">email</contactPointField>
          <contactPointField name="Address">example@sendwordnow.com</contactPointField>
        </contactPointList>
      </contact>
      <contact contactID="321" Action="AddOrModify">
        <contactField name="FirstName">Sally</contactField>
        <contactField name="LastName">Testgirl</contactField>
        <contactPointList>
          <contactPoint type="Email" />
          <contactPointField name="Label">email</contactPointField>
          <contactPointField name="Address">1example@sendwordnow.com</contactPointField>
        </contactPointList>
      </contact>
    </catchContactList>
    

    【讨论】:

    • 嗯,没有比那些人更好的了,我喝咖啡时回答了。谢谢你。我在转动我的轮子。
    猜你喜欢
    • 2011-11-30
    • 2011-04-20
    • 2011-02-08
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    相关资源
    最近更新 更多