在 SQL 服务器 table 中解析 XML 数据

Parse XML data in SQL Server table

我正在研究 xml 解析,使用我在 Whosebug 中找到的示例,但我遇到了一个疑问。 如果我有这样的东西

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)

我得到了这样的东西

CODE    NAME
123     Branan

但是如果我想将其中一个字段存储为 xml

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

我想要这样的东西

 Active   Weight    ColWithXML
  true     0.02     <oo_master><Code>123</Code><Name>Branan</Name></oo_master>


SELECT 
    n.value('Active[1][not(@xsi:nil = "true")]', 'BIT') as Active
 , n.value('Weight[1][not(@xsi:nil = "true")]', 'DECIMAL(29,5)') as Weight
, ??????????????????

我该怎么做?谢谢

这个答案是在我的lptr评论中提供的,它回答了OP的问题。为了保留评论的有用性,因为它们可以随时删除,我将其作为答案发布。

这里他们(lptr)使用xml数据类型(query() Method (xml Data Type))的query方法来达到你的目的。他们使用了 2 种不同但相似的解决方案:

a.n.query('.')

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
 ,a.n.query('.')
FROM @xml.nodes('/oo_outbound_order/oo_master') as a(n)

db<>fiddle

..or n.query('oo_master') FROM @xml.nodes('/oo_outbound_order')

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
 ,a.n.query('.')
FROM @xml.nodes('/oo_outbound_order/oo_master') as a(n);


select @xml ='<?xml version="1.0" encoding="UTF-8"?> 
<oo_outbound_order> 
        <Active>true</Active>
        <Weight>0.02</Weight>
         <oo_master>
              <Code>123</Code>
              <Name>Branan</Name> 
        </oo_master>
    </oo_outbound_order>';
  
SELECT 
n.value('Active[1][not(@xsi:nil = "true")]', 'BIT') as Active
 , n.value('Weight[1][not(@xsi:nil = "true")]', 'DECIMAL(29,5)') as Weight
 , a.n.query('./oo_master')
FROM @xml.nodes('/oo_outbound_order') as a(n);

db<>fiddle