在 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)
..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);
我正在研究 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)
..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);