SQL Server 쿼리에 노드 이름을 사용하지 않고 속성 아무것도. 나는 모든 노드에서 "PropertyName"속성을 읽고 싶습니다.읽기 XML 노드는 내가 XML은 다른 태그 이름 만 같은 속성 이름으로 데이터베이스에 저장 한
가능합니까? 그렇다면 누군가 나를 인도 해주시기 바랍니다. 당신이 PROPERTYNAME 속성이없는 요소가있을 수 있다고 예상되는 경우
SQL Server 쿼리에 노드 이름을 사용하지 않고 속성 아무것도. 나는 모든 노드에서 "PropertyName"속성을 읽고 싶습니다.읽기 XML 노드는 내가 XML은 다른 태그 이름 만 같은 속성 이름으로 데이터베이스에 저장 한
가능합니까? 그렇다면 누군가 나를 인도 해주시기 바랍니다. 당신이 PROPERTYNAME 속성이없는 요소가있을 수 있다고 예상되는 경우
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)
모든 노드의 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 ...
시간과 도움을 주셔서 감사합니다. 그러나 위의 솔루션은 저에게 효과적이었습니다! –
그런 다음 선택한 솔루션을 기반으로이 예제를 살펴보십시오.'DECLARE @x XML;
Owh! 알 겠어 ... 노드가 특성을 포함하지 않으면 NULL을 반환하고 이것은 앞으로 문제가 될 것입니다. 이 솔루션을 사용해야합니다! 명확히하고 나를 안내해 주셔서 감사합니다! –
감사합니다. 그것은 나를 위해 일했다! –
@ 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만을 반환합니다. –
@BogdanSahlean, 당신 말이 맞아요. 그러나 원래 데이터에는 중첩 된 요소가 없으며 이것이 가정입니다. 필요한 경우 .nodes ('/ *')'를 .nodes ('// * [@ PropertyName]')'로 변경하여 일반화 할 수 있습니다. 어쨌든 나는 수락 표시에 영향을 미치지 않습니다. –