无名

长风破浪会有时,直挂云帆济沧海!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
0 vote down star

Use OPENXML to get dt element in MSSQL 2005. How can I get xmlns:dt element in xml? For example, get a result set of two rows that list product id and country code.

121403 GBR

121403 USA

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

Here is one solution that I know by using xmlEdgeTable, but I am looking for a better solution.

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  

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, '//hm:product',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
摘自:http://stackoverflow.com/questions/1440848/openxml-with-xmlnsdt
posted on 2009-11-24 01:16  无名  阅读(404)  评论(0编辑  收藏  举报