[SQL] XMLNS와 OPENXML : DT
SQLXMLNS와 OPENXML : DT
사용 OPENXML은 MSSQL 2005 년 DT 요소를 얻을 수 있습니다. 어떻게 XMLNS를 얻을 수 있습니다 : XML에서 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, @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
해결법
-
==============================
1.이 작업을 수행하기 위해 OPENXML을 사용하는 데 필요한 특별한 이유가 있나요? 당신은 쉽게이 같은 2005 년 XQUERY와 정보를 얻을 수 있습니다 :
이 작업을 수행하기 위해 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, @xmldata, @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
-
==============================
2.작은 데이터 세트의 경우, XQuery와 OPENXML 사이에 큰 차이가 없다
작은 데이터 세트의 경우, XQuery와 OPENXML 사이에 큰 차이가 없다
여기에 27,615 행을 얻기 위해 6.5 MB XML 파일을 구문 분석 결과는 다음과 같습니다
from https://stackoverflow.com/questions/1440848/openxml-with-xmlnsdt by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SELECT 목록에서 별칭 다른 곳에서 참조 (0) | 2020.05.16 |
---|---|
[SQL] 동적 열 플러스 컬럼 이름 UNPIVOT (0) | 2020.05.16 |
[SQL] SQL에서 처음 2 특수 문자 사이의 문자를 가져옵니다 (0) | 2020.05.16 |
[SQL] 오라클에서 피벗 테이블을 사용하여 조언 (0) | 2020.05.16 |
[SQL] ExecuteNonQuery는이 반환 -1 쿼리 문자열에도 불구하고 SQL COUNT를 사용하는 경우 (0) | 2020.05.16 |