使用SQL提取XML中的根节点名称

时间:2018-07-02 18:47:57

标签: sql sql-server xml tsql

在下表中,

enter image description here

是否可以使用SQL Server从“ XML_data”列中单独提取根节点“ Main”的名称?

更新:

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 :(得分:2)

  

是否可以使用SQL Server从“ XML_data”列中单独提取根节点“主” 的名称?

是的,有可能:

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

DBFiddle Demo


编辑:

或使用.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

答案 1 :(得分:1)

这是一个(正确的)脚本,用于在屏幕截图中创建表格。该查询显示如何从每一行中选择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;