简体   繁体   English

如何解析SQL Server表中的XML数据

[英]How to parse XML data in SQL server table

I have SQL table: 我有SQL表:

Create table
(
ID varchar(50) not null,
Action nvarchar(max) null
)

Action column contains XML data. 操作列包含XML数据。 Format: 格式:

<?xml version="1.0" encoding="UTF-8"?> 
<oo_outbound_order>   
         <oo_master>
              <Code>123</Code>
              <Name>Branan</Name> 
    </oo_master> 
    </oo_outbound_order>

How to parse this column? 如何解析此列? Result should be like this: 结果应该是这样的:

CODE    NAME
123     Branan

There are many tutorial articles about xml parsing with TSQL. 有很多有关使用TSQL进行xml解析的教程文章。 For example, http://www.sqlserver.info/syntax/parse-xml-with-sql-server/ 例如, 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)

Try the follwing meathod : 尝试下面的肉类:

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)

It is a very bad idea to store XML data in a string column. 将XML数据存储在字符串列中是一个非常糟糕的主意。

Even worse, you are storing a string, which is claiming I'm encoded as utf-8 ! 更糟糕的是,您正在存储一个字符串,声称我被编码为utf-8 , but it is stored in a column of NVARCHAR , which is UCS-2 (almost the same as utf-16 ). ,但存储在NVARCHAR列中,该列为UCS-2 (与utf-16几乎相同)。

That means, that you have to repair this and cast the string to XML before you can use it. 这意味着,您必须先修复此问题并将其转换为XML,然后才能使用它。 You'll have to do these expensive operations whenever you grab into it. 每当您抓住它时,都必须执行这些昂贵的操作。 If you can change this, you should store XML in a column natively typed. 如果可以更改此设置,则应将XML存储在本机键入的列中。

Nevertheless this can be done. 尽管如此,这是可以做到的。 Try this. 尝试这个。

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;

Hint: If there are no repeating elements, there is no need for .nodes() as other answers suggest... 提示:如果没有重复元素,则不需要.nodes() ,其他答案表明...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM