我有一个具有以下属性的表:
ID类数据(xml) 1个辅助XML数据
下面是我存储在data属性上的示例xml结构。
<Root>
<Data>
<Name>John</Name>
<Rank>1</Rank>
</Data>
<Data>
<Name>Peter</Name>
<Rank>2</Rank>
</Data>
</Root>
我想编写一个SQL查询,该查询将为我提供表中的以下数据:
ID,班级和等级2学生姓名 我的查询是
Select ID,Class,Data.value('(/Root/Data/Name)[1]', 'NVARCHAR(3)') AS [Rank 2 Student Name]
FROM [Students]
这很好,但是将节点号硬编码为1并不是一个好主意,因为如果我在xml中添加新的Data节点,则数据将更改。这是可能的。因此,有一种方法可以为Rank值为2的节点指定返回名称。
谢谢。
答案 0 :(得分:1)
您可以使用此:
DECLARE @tbl TABLE (xmlcol xml )
INSERT INTO @tbl
VALUES ('<Root>
<Data>
<Name>John</Name>
<Rank>1</Rank>
</Data>
<Data>
<Name>Peter</Name>
<Rank>2</Rank>
</Data>
</Root>')
SELECT *
FROM
(
SELECT r.d.value ('(./Name/text())[1]', 'varchar(50)') [Name],
r.d.value ('(./Rank/text())[1]', 'varchar(50)') [Rank]
FROM @tbl
CROSS APPLY xmlcol.nodes ('/Root/Data') R(d)
) P
WHERE P.[Rank] = 2
这将输出以下结果:
Name Rank
Peter 2
答案 1 :(得分:0)
您可以在xml中应用过滤器,如下所示:
DECLARE @Students TABLE(ID int, Class varchar(10), Data xml)
INSERT @Students VALUES (1,'A', '<Root>
<Data>
<Name>John</Name>
<Rank>1</Rank>
</Data>
<Data>
<Name>Peter</Name>
<Rank>2</Rank>
</Data>
</Root>')
SELECT ID,Class,Data.value('(/Root/Data[Rank=2]/Name)[1]', 'NVARCHAR(5)') AS [Rank 2 Student Name]
FROM @Students
结果
ID Class Rank 2 Student Name
----------- ---------- -------------------
1 A Peter
修改。如果“等级”包含自由文本,请使用引号:
DECLARE @Students TABLE(ID int, Class varchar(10), Data xml)
INSERT @Students VALUES (1,'A', '<Root>
<Data>
<Name>John</Name>
<Rank>1</Rank>
</Data>
<Data>
<Name>Peter</Name>
<Rank>0:Company name</Rank>
</Data>
</Root>')
SELECT ID,Class,Data.value('(/Root/Data[Rank="0:Company name"]/Name)[1]', 'NVARCHAR(5)') AS [Rank 2 Student Name]
FROM @Students