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')