【问题标题】:convert XML attribute to json将 XML 属性转换为 json
【发布时间】:2021-10-26 12:50:30
【问题描述】:

作为一个简化示例,请考虑这个包含两个字段的表。一个是字符串,另一个是 XML。

SELECT TOP (1) [Source]
      , OrderParameter
  FROM [Rops].[dbo].[PreOrder]
  • Source="MediaConversions"
  • OrderParameter=""

现在我想查询表并将结果作为json,但也将XML一次性转换为json。

SELECT TOP (1) [Source]
      , OrderParameter
  FROM [Rops].[dbo].[PreOrder]
for json path;

结果

[{"Source":"MediaConversions","OrderParameter":""}]

但我希望将其转换为:

[{"Source":"MediaConversions","OrderParameter":{ "ParameterList":[ “x”:1,“y”:10]} ]

如何添加“for json”来转换xml?

SELECT TOP (1) [Source]
      , select OrderParameter for json path????
  FROM [Rops].[dbo].[PreOrder]
for json path;

【问题讨论】:

  • OrderParameter 的输入数据是<?xml version="1.0" encoding="utf-16"?> 时,我不明白为什么您的“结果”可以包含<ParameterList ... 等。我在 MS SQL Server 中创建了一个临时表并运行了您的第二个查询(以for json path 结尾的那个),它给了我[{"Source":"MediaConversions","OrderParameter":"<?xml version=\"1.0\" encoding=\"utf-16\"?>"}]。我不确定我是否看到了问题。

标签: json sql-server xml


【解决方案1】:

您似乎想要提取 XML 中 ParameterList 节点的内部文本。为此,您可以使用 .value 和 XQuery:

SELECT TOP (1) [Source]
      , OrderParameter = (
           SELECT
              x = x.PL.value('(x/text())[1]','int'),
              y = x.PL.value('(y/text())[1]','int')
           FROM (VALUES( CAST(OrderParameter AS xml) )) v(OrderParameter)
           CROSS APPLY v.OrderParameter.nodes('ParameterList') x(PL)
           FOR JSON PATH, ROOT('ParameterList')
        )
  FROM [Rops].[dbo].[PreOrder]
FOR JSON PATH;

【讨论】:

  • 看起来不错,但是 orderparameter 是 ntext 类型并且做一个 cast(orderparam as xml).nodes 无效
  • 好的,你可以把它放在CROSS APPLY (VALUES中。请注意,ntext 已弃用,无论如何您都应该将 XML 存储在 xml 列中
  • 这是一个 15 年历史的表,我试图通过将其放入 mongodb 来删除它,而不是更改架构。但是谢谢!学到了很多
猜你喜欢
  • 2016-08-09
  • 2016-10-26
  • 2019-01-04
  • 1970-01-01
  • 1970-01-01
  • 2018-07-23
  • 1970-01-01
  • 2020-03-12
  • 1970-01-01
相关资源
最近更新 更多