加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

sql – 带xmlns的OPENXML:dt

发布时间:2021-01-26 09:48:07 所属栏目:编程 来源:网络整理
导读:行使OPENXML在MSSQL 2005中获取dt元素. 如安在xml中获取xmlns:dt元素?譬喻,获取列生产物ID和国度/地域代码的两行功效集. 121403 GBR 121403美国 declare @xmldata xml set @xmldata = '?xml version="1.0"? data xmlns="http://www.aaa.com/master_browse_r

行使OPENXML在MSSQL 2005中获取dt元素.
如安在xml中获取xmlns:dt元素?譬喻,获取列生产物ID和国度/地域代码的两行功效集.

121403 GBR

121403美国

declare @xmldata xml
    set @xmldata = 
    '<?xml version="1.0"?>
    <data xmlns="http://www.aaa.com/master_browse_response" xmlns:dt="http://www.aaa.com/DataTypes">
      <products>
        <product>
       <product_id><![CDATA[121403]]></product_id>
          <countries>
            <dt:country>GBR</dt:country>
            <dt:country>USA</dt:country>
          </countries>
        </product>
     </products>
    </data>'

     DECLARE @hDoc int,@rootxmlns varchar(100)
     SET @rootxmlns = '<root xmlns:hm="http://www.aaa.com/master_browse_response"/>'

     EXEC sp_xml_preparedocument @hDoc OUTPUT,@xmldata,@rootxmlns  

     SELECT *
     FROM OPENXML(@hDoc,'//hm:product',2)
     WITH ([hm:product_id] int,[hm:countries] varchar(100))

     --clean up 
     EXEC sp_xml_removedocument @hDoc

这是我通过行使xmlEdgeTable知道的一个办理方案,但我正在探求更好的办理方案.

DECLARE @hDoc int,@rootxmlns varchar(100)
SET @rootxmlns = '<root xmlns:hm="http://www.aaa.com/master_browse_response"/>'

EXEC sp_xml_preparedocument @hDoc OUTPUT,@rootxmlns  

CREATE TABLE #xmlEdgeTable
( 
    id int,parentid int,localname varchar(20),[text] varchar(20)
)

INSERT INTO #xmlEdgeTable
SELECT id,parentid,localname,cast([text] as varchar(20)) 
FROM OPENXML(@hDoc,2)

SELECT t6.text,t2.text FROM #xmlEdgeTable AS t1 INNER JOIN 
    #xmlEdgeTable AS t2 ON t1.id = t2.parentid INNER JOIN 
    #xmlEdgeTable AS t3 ON t3.id = t1.parentid INNER JOIN 
    #xmlEdgeTable AS t4 ON t4.id = t3.parentid INNER JOIN 
    #xmlEdgeTable AS t5 ON t4.id = t5.parentid INNER JOIN
    #xmlEdgeTable AS t6 ON t5.id = t6.parentid 
WHERE t1.localname = 'country' and t5.localname ='product_id'

--clean up 
EXEC sp_xml_removedocument @hDoc
DROP TABLE #xmlEdgeTable

办理要领

是否有非凡缘故起因必要行使OPENXML来执行此操纵?您可以在2005年行使XQUERY轻松获守信息,如下所示:
declare @xmldata xml    
set @xmldata = 
'<data xmlns="http://www.aaa.com/master_browse_response" xmlns:dt="http://www.aaa.com/DataTypes">
  <products>
    <product>
      <product_id>121403</product_id>
      <countries>
        <dt:country>GBR</dt:country>
        <dt:country>USA</dt:country>
      </countries>
    </product>
  </products>
</data>'

;WITH XMLNAMESPACES 
(
    DEFAULT 'http://www.aaa.com/master_browse_response','http://www.aaa.com/DataTypes' as dt
)
SELECT  x.c.value('(../../product_id)[1]','varchar(100)') as product_id,x.c.value('(.)[1]','varchar(100)') as country
FROM @xmldata.nodes('/data/products/product/countries/dt:country') x(c)

较新的XQUERY成果是办理题目的更好选择.

编辑:
与OPENXML沟通的办理方案是:

declare @xmldata xml    
set @xmldata = 
'<data xmlns="http://www.aaa.com/master_browse_response" xmlns:dt="http://www.aaa.com/DataTypes">
  <products>
    <product>
      <product_id>121403</product_id>
      <countries>
        <dt:country>GBR</dt:country>
        <dt:country>USA</dt:country>
      </countries>
    </product>
  </products>
</data>'

DECLARE @hDoc int,@rootxmlns varchar(100)
SET @rootxmlns = '<root xmlns:hm="http://www.aaa.com/master_browse_response" xmlns:dt="http://www.aaa.com/DataTypes"/>'
EXEC sp_xml_preparedocument @hDoc OUTPUT,@rootxmlns

SELECT *
FROM OPENXML(@hDoc,'//hm:product/hm:countries/dt:country',2)
        WITH(Country    varchar(100) '.',Product_ID varchar(100) '../../hm:product_id')

EXEC sp_xml_removedocument @hDoc

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读