0

SQL Server 2005/2008.xml 메서드를 사용하여 SQL Server에서 XML 엔터티를 나열하는 방법은 무엇입니까?

저는 여기와 다른 곳에서 그리고 BOL에서 몇 가지 질문을 수색하고 읽었지만, 지금까지이 질문에 직접 답한 적이 없습니다. 이 있는지

, 방금

declare @xml xml = '<Root> <Ent foo="abc" bar="def" /> </Root>' 

나는를 sp_xml_preparedocument 및 OPENXML을 사용하여이 작업을 수행하는 방법을 알고

col1  col2 
----------------- 
foo   abc 
bar   def 

처럼 무언가의 결과 집합을 얻을 수있는 방법이 있나요

궁금하네요 감안할 xml 메서드를 사용하여 직접 수행하는 방법. 나는 BOL이나 인터넷 검색에서 아무 것도 찾을 수 없었지만 뭔가를 놓치지 않았는지 확인하려고했습니다.

감사합니다.

+0

이 질문과 대답이 도움이 되셨습니까? http://stackoverflow.com/questions/324289/xquery-to-get-list-of-attributes – Andrew

+0

죄송합니다. 때때로 이러한 것들은 제가 빠뜨린 것들을 깨닫습니다. sp_xml_preparedocument 및 OPENXML에 대한 호출과 마찬가지로 T-SQL에서이 작업을 수행하려고합니다. – vr8ce

+0

SQL Server에서는 T-SQL 내에서 XQuery의 하위 집합을 사용할 수 있습니다. 그래서 나는 그 특별한 질문을 지적했다. 나는 당신의 질문을 더 볼 시간이 없었지만 이전 질문의 목적이 현재의 질문의 목적과 비슷하게 보입니다. – Andrew

답변

2

일반적으로 query() 메서드는 value()보다 느리게 작동합니다. 따라서 value() 메서드를 사용하는 것이 좋습니다.

SELECT 
    b.value('local-name(.)','nvarchar(MAX)') as col1, 
    b.value('data(.)','nvarchar(MAX)') as col2 
FROM @xml.nodes('//Root/Ent/@*') a(b) 

이전 답변과 비교하면 약 3 배 빠릅니다.

+0

이것은 훨씬 더 나은 해결책입니다. +1 – etliens

+0

동의하고 미안해 이렇게 말하기에는 너무 오래 걸렸습니다! – vr8ce

+0

vr8ce, 문제가 없습니다. 저자에게 도움이되기를 바랍니다. – Dalex

3

이렇게하면 필요한 것을 얻을 수있는 출발점이 될 수 있습니다.

DECLARE @xml xml = N'<Root> <Ent foo="abc" bar="def" /> </Root>'; 

WITH [Attributes]([xml]) 
AS 
(
    SELECT 
     @xml.query 
     (' 
      for $x in (/Root/Ent/@*) 
      return <attribute name="{local-name($x)}" value="{data($x)}"/> 
     ') 
) 
SELECT 
    [Attribute].[data].value(N'@name', N'nvarchar(max)') AS [col1], 
    [Attribute].[data].value(N'@value', N'nvarchar(max)') AS [col2] 
FROM 
    [Attributes] 
CROSS APPLY 
    [xml].nodes(N'attribute') AS [Attribute]([data]); 
+0

매력적인. 그것은 심각한 T-SQL과 XML-fu입니다. :) Andrew가 언급 한 질문이 T-SQL로 번역 할만큼 똑똑하지 않았습니다. 매우 감사합니다! – vr8ce

관련 문제