2

我将 XML 存储到具有不同标签名称但属性名称相同的数据库中:

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

这些只是两个示例,但标签名称可以是任何名称。我想从所有节点读取“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

但是,如果您想显示所有具有至少一个 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 回答