2012-03-08 3 views
10

나는이 XML이 :SQL Server : OPENXML 대 SELECT..FROM XML을 다룰 때?

DECLARE @x XML 
SET @x = 
    '<data> 
     <add>a</add> 
     <add>b</add> 
     <add>c</add> 
    </data>'; 

작업 :

내가 a,b,c을 나열합니다.

방법 1 :

SELECT s.value('.', 'VARCHAR(8000)') AS [ADD] 
FROM @x.nodes('/data/add') AS t(s) 

방법 2 :

DECLARE @idoc INT 
EXEC sp_xml_preparedocument @idoc OUTPUT, @x 

SELECT * 
FROM OPENXML(@idoc, '/data/add', 2) 
     WITH ([add] NVARCHAR(MAX) '.') 

둘 다 줘 :

enter image description here

Q를 희망 :

이것이 바람직한 방법입니까?

후자와 전 (또는 부사)의 이점이 있습니까?

+1

개인적으로 접근 # 1을 선호 (2005은 SQL 서버에서 테스트) 그냥 일반 사용하기 쉽습니다. –

+2

@marc_s 그리고 그걸로 ... # 1은 Views 등에서 사용될 수 있습니다. –

답변

9

비용 여기서 제 approch 97 %를 소비 것을 알 수있다. 나는 항상 그것에 대해 어떤 결론을 도출하지 않을 것이다. XML 구조화 방법과 XML 쿼리 방법에 따라 달라질 수 있습니다.

저장 프로 시저 테스트 :

create procedure TestXML 
    @X xml 
as 
set nocount on 

select X.N.value('.', 'varchar(8000)') 
from @X.nodes('/root/item') as X(N) 

go 

create procedure TestOpenXML 
    @X xml 
as 
set nocount on 

declare @idoc int 
exec sp_xml_preparedocument @idoc out, @X 

select value 
from openxml(@idoc, '/root/item',1) 
    with (value varchar(8000) '.') 

exec sp_xml_removedocument @idoc 

시험 :

declare @X xml 

set @X = 
    (
    select number as '*' 
    from master..spt_values 
    for xml path('item'), root('root'), type 
) 

set statistics time on 
exec TestXML @X 
exec TestOpenXML @X 

결과 접근법 1 :

SQL Server Execution Times: 
    CPU time = 63 ms, elapsed time = 70 ms. 

결과 방법 2 :

SQL Server Execution Times: 
    CPU time = 156 ms, elapsed time = 159 ms. 
,536,913,632 그것은 SA의 훨씬 더 직관적 인 나에게, 그리고 그것은`sp_xml_preparedocument` 등의 추가 단계를 필요로하지 않는다 - - 10

+0

@PraVn이 신발에 반대 답변을하면 시간이 얼마나 걸립니까? –

+0

@RoyiNamir - 쿼리 비용은 실행 시간과 같지 않으며 XML 쿼리의 경우 쿼리 비용은 신뢰할 수 없습니다. –

+0

(아이디어 만) - 어떻게 해결할 수 있습니까?http://stackoverflow.com/questions/10818115/cell-to-cell-comparison-in-sql-server (대답을 귀찮게하지 말고 단어로 대답하십시오 ...) 시간 내 주셔서 감사합니다. –

2

나는 # 2를 선호합니다. 실행 계획을 시도하고 COND으로 한 간단한 테스트가 접근법 1접근법 2보다 시간이 덜 걸리는 것을 알 3 %

enter image description here

+1

노력에 감사드립니다 : p.s. 배치 대비 3 %. 배치는 무엇입니까? 다른 97 %는 어디에 있습니까? –

+2

XML 데이터 형식을 사용할 때 쿼리 비용 견적을 신뢰할 수 없다고 생각합니다. –

+1

@RoyiNamir 단일 배치에서 쿼리를 실행했습니다. 첫 번째 경우는 97 %, 두 번째 경우는 3 %입니다. – PraveenVenu

0
SET NOCOUNT ON; 
DECLARE @BankXml VARCHAR(MAX) = '<ROOT><ITEM BAF="HI" /></ROOT>' 
DECLARE @ErrMsg VARCHAR(MAX) ='',@XmlId INT,@TranCount INT 
CREATE TABLE #tmptbl(BAF VARCHAR(10)) 
IF (@BankXml IS NOT NULL)   
    BEGIN   
     EXEC SP_XML_PREPAREDOCUMENT @XmlId OUTPUT, @BankXml 
     INSERT INTO #tmptbl(BAF) 
     SELECT BAF 
     FROM OPENXML(@XmlId, 'ROOT/ITEM', 1) WITH 
     (
      BAF VARCHAR(10) 
     )       
    END 
BEGIN TRY 
    IF @@TRANCOUNT = 0 
     SET @TranCount = 1 
    IF @TranCount=1 
     BEGIN TRAN 
    IF 1=1 
    BEGIN 
     SELECT BAF FROM #tmptbl 
    END  
    IF @TranCount = 1 
     COMMIT TRAN 
END TRY 
BEGIN CATCH 
    IF @@TRANCOUNT = 1 AND @TranCount = 1 
    ROLLBACK TRAN 
    SET @ErrMsg = 'Error : ' + @ErrMsg + ' : ' + ERROR_MESSAGE() 
    RAISERROR(@ErrMsg,16,1) 
END CATCH