5

我在查询存储在 SQL Server 2012 数据库中的 XML 数据时遇到问题。我要查询的节点树格式如下——

<eForm>
   <page id="equalities" visited="true" complete="true">
      <Belief>
         <item selected="True" value="Christian">Christian</item>
         <item selected="False" value="Jewish">Jewish</item>
         ...
      </Belief>
   </page>
</eForm>

我想做的是返回选定属性等于true的项目节点的值属性。我已经阅读了几个关于在 SQL 中查询 XML 的教程,但似乎无法正确编写代码。

谢谢斯图

4

3 回答 3

4

演示

SELECT [value].query('data(eForm/page/Belief/item[@selected="True"]/@value)')
FROM test
于 2013-08-16T10:07:17.337 回答
1
select
    Value.value('(eForm/page/Belief/item[@selected="True"])[1]/@value', 'nvarchar(max)')    
from test

sql 小提琴演示

于 2013-08-16T10:12:17.920 回答
0
DECLARE @T TABLE (X XML);
INSERT @T VALUES ('<eForm>
                       <page id="equalities" visited="true" complete="true">
                          <Belief>
                             <item selected="True" value="Christian">Christian</item>
                             <item selected="False" value="Jewish">Jewish</item>
                          </Belief>
                       </page>
                    </eForm>')

SELECT  item.value('item[1]', 'NVARCHAR(50)')       
FROM    @T
        CROSS APPLY X.nodes('eForm/page/Belief') i (item)
WHERE   item.value('(item[1]/@selected)[1]', 'VARCHAR(5)') = 'true';

注意

我实际上更喜欢 MarcinJuraszek 发布的另一种方法,但是如果您需要更多数据来提取,以下方法可能会有优势。我最初删除了答案,但在某些情况下这种方法很有用,因此为了显示我未删除的所有选项。

于 2013-08-16T10:08:31.803 回答