【问题标题】:Parse XML in SQL server for specific value在 SQL Server 中解析 XML 以获取特定值
【发布时间】:2021-08-05 13:09:04
【问题描述】:

我正在寻找一种方法来检索 SQL Server 数据库中嵌入在 XML 中的特定信息

现在我的查询是:

SELECT
    Name, 
    XML.query('/CatalogItem/parameters/.').value('.', 'varchar(MAX)') as [Info]
FROM 
    [ePO].[dbo].[UDLP_DEFINITIONS] 
WHERE 
    [Type] = '80' OR [Type] = '81' AND CatalogID = 'D1234'

结果是

Name = Mobizen 32Go

Info = <conditions><condition grouping="or"><prop-key>vid_pid</prop-key><op-key>equals</op-key><value><![CDATA[1F75||0903||]]></value></condition></conditions>

你能告诉我如何在我的例子中得到这样的输出格式吗:

NAME                    VID            PID
---                     ---            ----
Mobizen 32 Go          1F75            0903

VID / PID 的值必须来自 ![&lt;value&gt; 中的 CDATA 字段

非常感谢

杰拉德

【问题讨论】:

  • 什么是原始XML,请edit
  • 在提出问题时,您需要提供一个可重现的最小示例。请参考以下链接:stackoverflow.com/help/minimal-reproducible-example 请提供以下内容: (1) DDL 和样本数据填充,即 CREATE table(s) 加上 INSERT T-SQL 语句。 (2) 你需要做什么,即逻辑和你的代码尝试在 T-SQL 中实现它。 (3) 期望的输出,基于上面#1 中的样本数据。 (4) 你的 SQL Server 版本 (SELECT @@version;)

标签: sql-server xml tsql xquery


【解决方案1】:

由于我不知道原始 xml 是什么样子,我刚刚将您的原始查询作为子查询进行了处理,请随意重构它。

SELECT Name, 
  REVERSE(PARSENAME(REPLACE(REVERSE(Info.value('(conditions/condition/value)[1]', 'nvarchar(max)')), '||', '.'), 1)) VID,
  REVERSE(PARSENAME(REPLACE(REVERSE(Info.value('(conditions/condition/value)[1]', 'nvarchar(max)')), '||', '.'), 2)) PID
FROM (
  SELECT
      Name, 
      XML.query('/CatalogItem/parameters/.').value('.', 'varchar(MAX)') as [Info]
  FROM 
      [ePO].[dbo].[UDLP_DEFINITIONS] 
  WHERE 
      [Type] = '80' OR [Type] = '81' AND CatalogID = 'D1234')

【讨论】:

  • 如何运行和测试你的 sql?
  • 这条记录的原始 XML 是:vid_pidequals
  • 问题是这个数据库是 McAfee EPO 的一个样本,对你来说复制起来并不容易。不幸的是,我无法让 d0little 查询工作,它在最后一个括号之后给我一个语法错误。我想测试的另一件事是,使用 xpath 测试仪,我能够通过 xpath 表达式 /conditions/condition/value/text() 获得我想要的(值:1F75|0903)关于如何设置 xpath 表达式的任何建议在 sql 语句上,并得到结果 1F75|0903 ?无论如何,感谢那些试图帮助我的人:-)
猜你喜欢
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 2018-09-15
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 1970-01-01
  • 2018-09-11
相关资源
最近更新 更多