【问题标题】:Get the count of nodes in an XML field XQuery SQL Server 2008获取 XML 字段中的节点数 XQuery SQL Server 2008
【发布时间】:2011-03-25 21:38:21
【问题描述】:

我正在尝试获取 XML 字段中的节点数。但我总是看到 0 结果。这是我的查询的样子。


 DECLARE @XmlTable TABLE (XmlResult XML)
INSERT INTO @XmlTable EXECUTE [dbo].usp_GetBooks @EditionId=400
--select * from  @XmlTable
SELECT
--Count number of nodes
  COUNT(*) AS BooksCount
FROM
(
SELECT XmlResult FROM @XmlTable
) AS XmlTable(XmlColumn)
CROSS APPLY XmlColumn.nodes('./books/book') XmlTableFunction(XmlColumn2);

我的 XML 看起来像:

<Version number ="1"> 
<books>
<book>
  <name> </name>
  <author></author>
</book>
<book>
  <name> </name>
  <author></author>
</book>
</books>
</Version>

【问题讨论】:

  • XML 是什么样的?零表示您没有来自 CROSS APPLY 的行...
  • @gbn。当我从 @XmlTable 中选择 * 时,我看到 EditionId = 400 的至少 3 个书籍元素
  • 您的 XML 样本无效 - 第一个 &lt;book&gt; 应该以 &lt;/book&gt; 结束(现在不是),&lt;Version number =1&gt; 无效 - 1 需要引用:&lt;Version number="1"&gt;

标签: xml sql-server-2008 cross-apply


【解决方案1】:

我认为你的 XPath 表达式是错误的 - 试试这个:

DECLARE @XmlTable TABLE (XmlResult XML)

INSERT INTO @XmlTable EXECUTE [dbo].usp_GetBooks @EditionId=400

SELECT
    COUNT(*) AS BooksCount
FROM
   (SELECT XmlResult FROM @XmlTable) AS XmlTable(XmlColumn)
CROSS APPLY 
   XmlColumn.nodes('/Version/books/book') XmlTableFunction(XmlColumn2)

甚至更简单:

DECLARE @XmlTable TABLE (XmlResult XML)

INSERT INTO @XmlTable EXECUTE [dbo].usp_GetBooks @EditionId=400

SELECT
    XmlResult.value('count(/Version/books/book)', 'int')
FROM
   @XmlTable

【讨论】:

    【解决方案2】:

    使用您提供的 XML 模式对我有用

    DECLARE @XmlTable TABLE (XmlResult XML)
    INSERT INTO @XmlTable VALUES ('<books><book><title>GWTW</title></book></books>')
    INSERT INTO @XmlTable VALUES ('<foo />')
    INSERT INTO @XmlTable VALUES ('<books />')
    SELECT
      COUNT(*) AS BooksCount
    FROM
    (
    SELECT XmlResult FROM @XmlTable
    ) AS XmlTable(XmlColumn)
    CROSS APPLY XmlColumn.nodes('./books/book') XmlTableFunction(XmlColumn2);
    

    Exist 方法也很有用。我使用 NULLIF 将 0 更改为 NULL(它有点,所以需要 CAST 和 SUM)

    SELECT COUNT(NULLIF(XmlResult.exist('./books/book'), 0)) FROM @XmlTable
    

    编辑,更新后

    您发布的 XML 也是错误的。

    您没有正确指定根音:

    DECLARE @XmlTable TABLE (XmlResult XML)
    INSERT INTO @XmlTable VALUES ('
    <Version number ="1"> 
    <books>
    <book>
      <name> </name>
      <author></author>
    </book>
    <book>
      <name> </name>
      <author></author>
    </book>
    </books>
    </Version>')
    SELECT
      COUNT(*)
    FROM
    (
    SELECT XmlResult FROM @XmlTable
    ) AS XmlTable(XmlColumn)
    CROSS APPLY XmlColumn.nodes('/Version/books/book') XmlTableFunction(XmlColumn2);
    
    SELECT
      COUNT(*)
    FROM
    (
    SELECT XmlResult FROM @XmlTable
    ) AS XmlTable(XmlColumn)
    CROSS APPLY XmlColumn.nodes('*/books/book') XmlTableFunction(XmlColumn2);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多