【发布时间】: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