SQL 服务器:指定列名作为 XML 的属性和节点值
SQL Server: Specify Column Name as Attribute and Node Value FOR XML
我需要 return 来自 SQL 服务器的 XML 中包含空格的列别名。 XML 需要看起来像这样:
<Records>
<Record>
<Field FieldName="PURCHASE_DETAIL_ID">31320</Field>
<Field FieldName="ORDER_ID">6507</Field>
<Field FieldName="PRODUCT_ORDER">1</Field>
</Record>
</Records>
我的 table 看起来像:
PURCHASE_DETAIL_ID | ORDER_ID | PRODUCT_ORDER
----------------------------------------------------
31320 6507 1
我想使用 XML 提取的 FOR XML
方法。
我尝试了以下方法,它适用于单列,但不适用于多列。
SELECT
'PURCHASE_DETAIL_ID' AS [Field/@FieldName],
'GOLI' + RTRIM(CONVERT(VARCHAR(10), ol.ID)) AS [Field],
'ORDER_ID' AS [Field/@FieldName],
o.ID AS [Field],
'PRODUCT_ID' AS [Field/@FieldName],
P.ID AS [Field]
FROM ...
WHERE ...
FOR XML PATH('Record'), ROOT('Records')
您可以尝试使用 xml 节点值,如下所示:
declare @xml xml =
'<Records>
<Record>
<Field FieldName="PURCHASE_DETAIL_ID">31320</Field>
<Field FieldName="ORDER_ID">6507</Field>
<Field FieldName="PRODUCT_ORDER">1</Field>
</Record>
</Records>'
;with cte as (
SELECT T.c.value('@FieldName', 'nvarchar(max)') AS result, T.c.value('.','int') as val
FROM @xml.nodes('/Records/Record/Field') T(c)
)
select * from cte
pivot (max(val) for result in ([PURCHASE_DETAIL_ID],[ORDER_ID],[PRODUCT_ORDER]) ) p
输出将是这样的:
如果您想按行获取结果,您可以单独在 cte 中执行查询
SELECT T.c.value('@FieldName', 'nvarchar(max)') AS result, T.c.value('.','int') as val
FROM @xml.nodes('/Records/Record/Field') T(c)
这会起作用
这就是你必须要做的...
SELECT
'PURCHASE_DETAIL_ID' AS [Field/@FieldName],
'GOLI' + RTRIM(CONVERT(VARCHAR(10), ol.ID)) AS [Field],
'',
'ORDER_ID' AS [Field/@FieldName],
o.ID AS [Field],
'',
'PRODUCT_ID' AS [Field/@FieldName],
P.ID AS [Field]
FROM ...
WHERE ...
FOR XML PATH('Record'), ROOT('Records')
我需要 return 来自 SQL 服务器的 XML 中包含空格的列别名。 XML 需要看起来像这样:
<Records>
<Record>
<Field FieldName="PURCHASE_DETAIL_ID">31320</Field>
<Field FieldName="ORDER_ID">6507</Field>
<Field FieldName="PRODUCT_ORDER">1</Field>
</Record>
</Records>
我的 table 看起来像:
PURCHASE_DETAIL_ID | ORDER_ID | PRODUCT_ORDER
----------------------------------------------------
31320 6507 1
我想使用 XML 提取的 FOR XML
方法。
我尝试了以下方法,它适用于单列,但不适用于多列。
SELECT
'PURCHASE_DETAIL_ID' AS [Field/@FieldName],
'GOLI' + RTRIM(CONVERT(VARCHAR(10), ol.ID)) AS [Field],
'ORDER_ID' AS [Field/@FieldName],
o.ID AS [Field],
'PRODUCT_ID' AS [Field/@FieldName],
P.ID AS [Field]
FROM ...
WHERE ...
FOR XML PATH('Record'), ROOT('Records')
您可以尝试使用 xml 节点值,如下所示:
declare @xml xml =
'<Records>
<Record>
<Field FieldName="PURCHASE_DETAIL_ID">31320</Field>
<Field FieldName="ORDER_ID">6507</Field>
<Field FieldName="PRODUCT_ORDER">1</Field>
</Record>
</Records>'
;with cte as (
SELECT T.c.value('@FieldName', 'nvarchar(max)') AS result, T.c.value('.','int') as val
FROM @xml.nodes('/Records/Record/Field') T(c)
)
select * from cte
pivot (max(val) for result in ([PURCHASE_DETAIL_ID],[ORDER_ID],[PRODUCT_ORDER]) ) p
输出将是这样的:
如果您想按行获取结果,您可以单独在 cte 中执行查询
SELECT T.c.value('@FieldName', 'nvarchar(max)') AS result, T.c.value('.','int') as val
FROM @xml.nodes('/Records/Record/Field') T(c)
这会起作用
这就是你必须要做的...
SELECT
'PURCHASE_DETAIL_ID' AS [Field/@FieldName],
'GOLI' + RTRIM(CONVERT(VARCHAR(10), ol.ID)) AS [Field],
'',
'ORDER_ID' AS [Field/@FieldName],
o.ID AS [Field],
'',
'PRODUCT_ID' AS [Field/@FieldName],
P.ID AS [Field]
FROM ...
WHERE ...
FOR XML PATH('Record'), ROOT('Records')