[英]How to parse XML data in SQL server table
我有SQL表:
Create table
(
ID varchar(50) not null,
Action nvarchar(max) null
)
操作列包含XML数据。 格式:
<?xml version="1.0" encoding="UTF-8"?>
<oo_outbound_order>
<oo_master>
<Code>123</Code>
<Name>Branan</Name>
</oo_master>
</oo_outbound_order>
如何解析此列? 结果应该是这样的:
CODE NAME
123 Branan
有很多有关使用TSQL进行xml解析的教程文章。 例如, http://www.sqlserver.info/syntax/parse-xml-with-sql-server/
DECLARE @xml xml
SET @xml =
'<?xml version="1.0" encoding="UTF-8"?>
<oo_outbound_order>
<oo_master>
<Code>123</Code>
<Name>Branan</Name>
</oo_master>
</oo_outbound_order>'
SELECT
n.value('(./Code/text())[1]','int') as CODE
, n.value('(./Name/text())[1]','Varchar(50)') as NAME
FROM @xml.nodes('/oo_outbound_order/oo_master') as a(n)
尝试下面的肉类:
DECLARE @XMLData XML = '
<oo_outbound_order>
<oo_master>
<Code>123</Code>
<Name>Branan</Name>
</oo_master>
</oo_outbound_order>'
SELECT
[Code] = Node.Data.value('Code', 'INT'),
[Name] = Node.Data.value('Name', 'NVARCHAR(20)')
FROM @XMLData.nodes('/oo_outbound_order/oo_master') Node(Data)
将XML数据存储在字符串列中是一个非常糟糕的主意。
更糟糕的是,您正在存储一个字符串,声称我被编码为utf-8
! ,但存储在NVARCHAR
列中,该列为UCS-2
(与utf-16
几乎相同)。
这意味着,您必须先修复此问题并将其转换为XML,然后才能使用它。 每当您抓住它时,都必须执行这些昂贵的操作。 如果可以更改此设置,则应将XML存储在本机键入的列中。
尽管如此,这是可以做到的。 尝试这个。
Create table #temp
(
ID varchar(50) not null,
[Action] nvarchar(max) null
)
INSERT INTO #temp(ID,[Action]) VALUES
('test 1',
'<?xml version="1.0" encoding="UTF-8"?>
<oo_outbound_order>
<oo_master>
<Code>123</Code>
<Name>Branan</Name>
</oo_master>
</oo_outbound_order>');
SELECT t.ID
,ActionXml.value('(/oo_outbound_order/oo_master/Code/text())[1]','nvarchar(max)') AS CODE
,ActionXml.value('(/oo_outbound_order/oo_master/Name/text())[1]','nvarchar(max)') AS [Name]
FROM #temp t
CROSS APPLY(SELECT CAST(REPLACE(t.[Action],'encoding="UTF-8"','encoding="UTF-16"') AS XML) ActionXml) A;
drop table #temp;
提示:如果没有重复元素,则不需要.nodes()
,其他答案表明...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.