在SQL Server中使用value()从xml列获取多个记录

Gra*_*eme 8 xquery sql-server-2005

此SQL仅返回第一个Activity元素.我如何选择它们?如果我删除查询中的[1],我会收到"value()需要单例"的错误.

 DECLARE @myDoc xml
    SET @myDoc = 
    '<Root>
        <Activities>
            <Activity>This is activity one</Activity>
            <Activity>This is activity two</Activity>
            <Activity>This is activity three</Activity>
        </Activities>
    </Root>'

    SELECT @myDoc.value('(/Root/Activities/Activity)[1]', 'varchar(100)' )
Run Code Online (Sandbox Code Playgroud)

Gra*_*eme 17

谢谢Ed,但我找到了一个更简单的版本:

SELECT T.C.value('.', 'varchar(100)') as activity
FROM @myDoc.nodes('(/Root/Activities/Activity)') as T(C)
Run Code Online (Sandbox Code Playgroud)

虽然从你的"不必要的复杂"例子看起来令人担忧的简单......

  • 如果XML标记出现多次并且我想选择它出现的次数怎么办?http://stackoverflow.com/questions/26426412/how-to-ensure-the-sql-is-able-to-read-all-xml-tag-data (2认同)
  • T是节点功能创建的派生表的别名。该节点函数返回一个包含所有“活动”节点名称和值的xml(如果有的话,也将返回任何子节点和值)。C是列别名,在这种情况下,C将xml分解为该列每一行上的“ Activity”节点。 (2认同)