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);
:如果你想從所有節點讀取
PropertyName
值
嘗試這種解決方案
結果:
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 ...
謝謝!它爲我工作! –
@ i-one:看看這個查詢'DECLARE @x XML; SET @ X = N '<書範疇= 「愛好和興趣」 類別ID = 「44」><章屬性名= 「111」/><體育類別= 「愛好和興趣」 類別ID = 「46」/>'; SELECT T.c.value('@ PropertyName','VARCHAR(100)')FROM @ x.nodes('/ *')T(c);'只返回空值,認爲有'PropertyName'屬性。 –
@BogdanSahlean,你說得對。但在原始數據中沒有嵌套元素,這就是假設。如果需要,可以通過將'.nodes('/ *')'改爲'.nodes('// * [@ PropertyName]')'來進行概括。無論如何,我對接受標記沒有影響。 –