Как получить значение тега XML типа строки varchar (MAX)? - PullRequest
2 голосов
/ 30 апреля 2019

Я работаю с SQL Server 2016.

У меня есть таблица employee_xml , в которой есть столбец employee_xml_string типа varchar(MAX).

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, чтобы получить значение тега <GovernmentIdentificationNumber>. Как я могу это сделать?

Спасибо

Ответы [ 3 ]

3 голосов
/ 30 апреля 2019

Вам нужно будет CAST / CONVERT значение вашего XML до 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; в конце концов это то, для чего оно существует.

2 голосов
/ 30 апреля 2019

Вы могли бы хранить XML как XML. Сказав это, вы всегда можете АКТЕРИТЬ это:

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)
2 голосов
/ 30 апреля 2019

Вы можете использовать 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)

Результат:

enter image description here

...