2013-07-25 2 views

답변

3
declare @xml xml 

set @xml = '<book Category="Hobbies And Interests" PropertyName="C#" CategoryID="44" /> 
<sport Category="Hobbies And Interests" PropertyName="Cricket" CategoryID="46" />' 

select T.c.value('@PropertyName', 'varchar(100)') 
from @xml.nodes('/*') T(c) 

, 당신은 사용할 수 있습니다

select T.c.value('@PropertyName', 'varchar(100)') 
from @xml.nodes('/*[@PropertyName]') T(c) 

당신은 또한 요소가 중첩 될 수 있다고 기대한다면, 당신은 사용할 수 있습니다

select T.c.value('@PropertyName', 'varchar(100)') 
from @xml.nodes('//*[@PropertyName]') T(c) 
+0

감사합니다. 그것은 나를 위해 일했다! –

+1

@ i-one :이 쿼리를보세요'DECLARE @x XML; SET @ x = N ' "취미 및 관심사"CategoryID = "44"><스포츠 카테고리 = "취미 및 관심 분야"CategoryID = "46"/>'; SELECT T.c.value ('@ PropertyName', 'VARCHAR (100)') FROM @ x.nodes ('/ *') T (c);'는 'PropertyName' 속성이 있다고 생각하는 NULL만을 반환합니다. –

+2

@BogdanSahlean, 당신 말이 맞아요. 그러나 원래 데이터에는 중첩 된 요소가 없으며 이것이 가정입니다. 필요한 경우 .nodes ('/ *')'를 .nodes ('// * [@ PropertyName]')'로 변경하여 일반화 할 수 있습니다. 어쨌든 나는 수락 표시에 영향을 미치지 않습니다. –

4

모든 노드의 PropertyName 값을 읽으려면이 솔루션을 사용하십시오.

DECLARE @MyTable TABLE(
    ID INT IDENTITY(1,1) PRIMARY KEY, 
    XmlCol XML NOT NULL 
); 
INSERT @MyTable(XmlCol) 
VALUES (N'<book Category="Hobbies And Interests" PropertyName="C#" CategoryID="44" />'); 
INSERT @MyTable(XmlCol) 
VALUES (N'<sport Category="Hobbies And Interests" PropertyName="Cricket" CategoryID="46" />'); 
INSERT @MyTable(XmlCol) 
VALUES (N'<CocoJambo PropertyName="Aircraft carrier" Category="Hobbies And Interests"> <CocoJamboChild PropertyName="Airplane"/> </CocoJambo>'); 
INSERT @MyTable(XmlCol) 
VALUES (N'<sport CategoryID="CocoJamboID" />'); 

SELECT a.*, 
     b.Node.value('(.)','NVARCHAR(100)') AS PropertyName_Value 
FROM @MyTable a 
-- OUTER APPLY or CROSS APLLY 
OUTER APPLY a.XmlCol.nodes('//@*[local-name(.)="PropertyName"]') b(Node); 

결과 :

ID   XmlCol         PropertyName_Value 
----------- ----------------------------------------- ------------------ 
1   <book Category="Hobbies And Interes ... C# 
2   <sport Category="Hobbies And Intere ... Cricket 
3   <CocoJambo PropertyName="Aircraft c ... Aircraft carrier 
3   <CocoJambo PropertyName="Aircraft c ... Airplane 
4   <sport CategoryID="CocoJamboID" />  NULL 

하지만 적어도 하나의PropertyName 속성 XML의 framents이있는 모든 행을 표시 할 경우에 당신이 시도 할 수 :

SELECT a.* 
FROM @MyTable a 
WHERE a.XmlCol.exist('//@*[local-name(.)="PropertyName"]')=1; 

결과 :

ID   XmlCol 
----------- ---------------------------------------------------------------------------------- 
1   <book Category="Hobbies And Interests" PropertyName="C#" CategoryID="44" /> 
2   <sport Category="Hobbies And Interests" PropertyName="Cricket" CategoryID="46" /> 
3   <CocoJambo PropertyName="Aircraft carrier" Category="Hobbies And Interests"><CocoJ ... 
+0

시간과 도움을 주셔서 감사합니다. 그러나 위의 솔루션은 저에게 효과적이었습니다! –

+3

그런 다음 선택한 솔루션을 기반으로이 예제를 살펴보십시오.'DECLARE @x XML; <스포츠 카테고리 = "취미 및 관심 분야"CategoryID = "46"/> '; SELECT T.c.value ('@ PropertyName', 'VARCHAR (100)') FROM @ x.nodes ('/ *') T (c);'. 'PropertyName = "111"'속성을 가진 요소를 보게 될 것이지만 그 결과는 NULL만을 보여줄 것입니다. –

+0

Owh! 알 겠어 ... 노드가 특성을 포함하지 않으면 NULL을 반환하고 이것은 앞으로 문제가 될 것입니다. 이 솔루션을 사용해야합니다! 명확히하고 나를 안내해 주셔서 감사합니다! –