2

タグ名は異なりますが、属性名は同じである XML をデータベースに格納しています。

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

これらは 2 つの例にすぎませんが、タグ名は何でもかまいません。すべてのノードから「PropertyName」属性を読み取りたい。

出来ますか?もしそうなら、誰か私を案内してください。

4

2 に答える 2

5
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)

PropertyName 属性のない要素が存在する可能性があると予想される場合は、次を使用できます。

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)
于 2013-07-25T12:08:31.410 に答える
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

ただし、少なくとも 1 つの PropertyName属性を持つ XML フレームを含むすべての行を表示する場合は、次のようにします。

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 ...
于 2013-07-25T12:41:39.100 に答える