我正在尝试使用FOR XML
从SQL查询返回XML,而我几乎就在那里,除非我似乎无法将其转换为我需要的确切格式。
以下是我到目前为止所做的陈述:
SELECT TOP 1
ID AS '@id'
,1 AS '@version'
,'en' AS '@lang'
,'Joe Smith' AS 'field/Name'
,'email@add.com' AS 'field/Email'
FROM Table
FOR XML PATH ('add')
它返回的XML格式:
<add id="123" version="1" lang="en">
<field>
<Name>Joe Smith</Name>
<Email>email@add.com</Email>
</field>
</add>
我需要它如何返回:
<add id="123" version="1" lang="en">
<field name="Name">Joe Smith</field>
<field name="Email">email@add.com</field>
</add>
我怎么做到目前为止,这是我在网上找到的文件最远的地方..请帮忙。
答案 0 :(得分:3)
1)
SELECT TOP 1
ID AS '@id'
,1 AS '@version'
,'en' AS '@lang'
,(
SELECT x.Attribute AS '@name',
x.Value AS 'text()'
FROM (VALUES (N'Name', N'Joe Smith'), (N'Email', N'email@add.com')) x(Attribute,Value)
FOR XML PATH('field'), TYPE
)
FROM (SELECT 1 ID) AS Table1
FOR XML PATH ('add')
2)第二个解决方案使用模板和变量。我提出这个解决方案是因为我看到TOP 1
(最多一行)。首先,您应该将该行的值传输到变量(SELECT @Variable = Column, ... FROM Table
)。您具有更大的灵活性,但的性能可能受到影响(注意:我没有进行任何测试)。
DECLARE
@ID INT = 1,
@Version INT = 1,
@Lang NVARCHAR(10) = N'en',
@Name NVARCHAR(50) = N'Joe Smith',
@Email NVARCHAR(100) = N'email@add.com'
DECLARE @x XML = N'';
SELECT @x.query(N'
<add id="{sql:variable("@ID")}" version="{sql:variable("@Version")}" lang="{sql:variable("@Lang")}">
<field name="Name">{sql:variable("@Name")}</field>
<field name="Email">{sql:variable("@Email")}</field>
</add>
');