Извлечение имени корневого узла в XML с использованием SQL - PullRequest
0 голосов
/ 02 июля 2018

Из приведенной ниже таблицы

enter image description here

Есть ли способ извлечь имя корневого узла «Main» отдельно из столбца «XML_data» с помощью сервера SQL?

UPDATE:

DECLARE @ProdID int 

create table #xmldata(id int,data xml)
insert into #xmldata
select
id = '011', 
data =  '<Root>  
<ProductDescription ProductID="1" ProductName="Road Bike">  
<Features>  
  <Warranty>1 year parts and labor</Warranty>  
  <Maintenance>3 year parts and labor extended maintenance is available</Maintenance>  
</Features>  
</ProductDescription>  
</Root>' 

select * from #xmldata

SET @ProdID =  #xmldata.data.value('(/Root)[1]', 'varchar' )  
SELECT @ProdID  

drop table #xmldata

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Есть ли способ извлечь имя корневого узла "Main" отдельно из столбца "XML_data" с помощью сервера SQL?

Да, это возможно:

SELECT s.c.value('local-name(.)','varchar(100)') AS root_name, sub.*
FROM #xmldata sub
CROSS APPLY sub.data.nodes('/*') s(c);

Демонстрация DBFiddle


EDIT:

Или используя .query() метод:

SELECT sub.data.query('local-name(/*[1])') AS root_name, sub.*
FROM #xmldata sub;

DBFiddle Demo2


РЕДАКТИРОВАТЬ 2:

Как уже упоминалось @ Shnugo , вы можете использовать .value() метод без .nodes():

SELECT sub.data.value('local-name((/*)[1])','varchar(100)') AS root_name, sub.*
FROM #xmldata sub;

DBFiddle Demo3

0 голосов
/ 02 июля 2018

Вот (правильный) скрипт для создания таблицы на вашем скриншоте. Запрос показывает, как выбрать значение узла name из каждой строки:

DROP TABLE IF EXISTS #xmldata;
CREATE TABLE #xmldata
(
    cid INT,
    cidtype CHAR,
    xml_data XML
);

INSERT #xmldata SELECT 1001,'N','<Main><ID>1001</ID><details><name>John</name><age>12</age></details></Main>';
INSERT #xmldata SELECT 1001,'N','<Main><ID>1003</ID><details><name>Diane</name><age>25</age></details></Main>';
INSERT #xmldata SELECT 1001,'N','<Main><ID>1004</ID><details><name>Kippy</name><age>26</age></details></Main>';

SELECT xml_data.value('(/Main/details/name)[1]','varchar(100)') AS [name]
FROM #xmldata;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...