2011-03-25 109 views
9

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


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> 
+0

什么XML看起来像什么?零意味着您没有来自CROSS APPLY的行... – gbn 2011-03-25 21:41:55

+0

@gbn。当我从@XmlTable中选择*时,我看到至少3个Edition元素的版本ID = 400 – BumbleBee 2011-03-25 21:50:09

+0

您的XML示例无效 - 第一个“”应该用''(它现在不是)关闭,并且'<版本号= 1>'无效 - 1需要用引号括起来:'' – 2011-03-25 22:19:11

回答

29

我觉得你的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); 

存在的方法是非常有用的。我使用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);