在 SQL Server 查询中不使用节点名称读取 XML 节点属性

Dha*_*hal 2 xml sql-server xml-attribute

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

<book Category="Hobbies And Interests" PropertyName="C#" CategoryID="44" />
<sport Category="Hobbies And Interests" PropertyName="Cricket" CategoryID="46" />
Run Code Online (Sandbox Code Playgroud)

这只是两个示例,但标签名称可以是任何内容。我想从所有节点读取“PropertyName”属性。

是否可以?如果是,那么请任何人指导我。

i-o*_*one 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)
Run Code Online (Sandbox Code Playgroud)

如果您希望可以有没有 PropertyName 属性的元素,您可以使用:

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

如果您还希望元素可以嵌套,则可以使用:

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

  • @BogdanSahlean,你说得对。但是在原始数据中没有嵌套元素,这是假设。如有必要,可以通过将 `.nodes('/*')` 更改为 `.nodes('//*[@PropertyName]')` 来泛化。无论如何,我对接受分数没有影响。 (2认同)