【问题标题】:How to get value of an XML tag of varchar(MAX) string type?如何获取 varchar(MAX) 字符串类型的 XML 标记的值?
【发布时间】:2019-09-19 04:52:09
【问题描述】:

我正在使用 SQL Server 2016。

我有一个表 employee_xml,其中有一个 varchar(MAX) 类型的列 employee_xml_string

CREATE TABLE employee_xml 
(
     employee_xml_id INT IDENTITY(1,1) NOT NULL, 
     employee_xml_string VARCHAR(MAX)
);

employee_xml_string 列存储一个 XML 字符串;例如:

<?xml version="1.0" encoding="UTF-8"?>
<Employees xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <Employee>
      <EmployeeNumber>58913A</EmployeeNumber>
      <FirstName>Shanee</FirstName>
      <LastName>McKenzie</LastName>
      <GovernmentIdentificationNumber>749146551</GovernmentIdentificationNumber>
   </Employee>
</Employees>

我想写SQL来获取&lt;GovernmentIdentificationNumber&gt;标签的值。我该怎么做?

谢谢

【问题讨论】:

  • 如果它只存储 XML - 为什么 不是 它是 type XML ??? 的列
  • @marc_s 这个表是很久以前创建的,所以我猜当时 XML 数据类型要么还没有引入,要么 DB 家伙犹豫使用它

标签: sql sql-server xml tsql sql-server-2016


【解决方案1】:

您必须将您的 XML 值 CAST/CONVERT 转换为 xml(所以我希望它们都是有效的 XML 值),然后您可以对转换后的值使用 XQUERY:

SELECT V.Employee_XML.value('(Employees/Employee/GovernmentIdentificationNumber/text())[1]','int') AS GovernmentIdentificationNumber
FROM dbo.employee_xml E
     CROSS APPLY (VALUES(TRY_CONVERT(xml,E.employee_xml_string))) V(Employee_XML);

然而,理想情况下,您应该将 XML 数据存储为 xml;毕竟这就是它的用途。

【讨论】:

  • 完美,我非常喜欢这里的 TRY_CONVERT 用法
【解决方案2】:

您可以使用nodes 将您的xml 分成几行,然后您可以使用value 选择正确的项目:

;with x as
(
    select cast(employee_xml_string as xml) as employee_xml
    from employee_xml
)
SELECT
    t.s.value('.', 'nvarchar(max)') AS GovernmentIdentificationNumber
FROM x
CROSS APPLY x.employee_xml.nodes('//Employees/Employee/GovernmentIdentificationNumber') t(s)

结果:

【讨论】:

    【解决方案3】:

    您可以将 xml 存储为 XML。话虽如此,你总是可以 CAST 它:

    SELECT employee_xml_xml.value('(/Employees/Employee/GovernmentIdentificationNumber)[1]', 'varchar(100)')
    FROM employee_xml
    CROSS APPLY (SELECT CAST(employee_xml_string AS xml)) AS x(employee_xml_xml)
    

    【讨论】:

      猜你喜欢
      • 2020-08-20
      • 1970-01-01
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      • 2018-06-04
      相关资源
      最近更新 更多