在下表中,
是否可以使用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
答案 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);
或使用.query()
方法:
SELECT sub.data.query('local-name(/*[1])') AS root_name, sub.*
FROM #xmldata sub;
如@Shnugo所述,您可以在没有.value()
的情况下使用.nodes()
方法:
SELECT sub.data.value('local-name((/*)[1])','varchar(100)') AS root_name, sub.*
FROM #xmldata sub;
答案 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;