2011-03-25 7 views
9

Estoy tratando de obtener el recuento de nodos en un campo XML. pero siempre veo 0 como resultado. Así es como se ve mi consulta.Obtenga el recuento de nodos en un campo 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); 

Mi XML se parece a:

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

Lo cómo se ve el XML? cero significa que no hay filas de CROSS APLICAR ... – gbn

+0

@gbn. cuando selecciono * de @XmlTable veo al menos 3 elementos de libro para EditionId = 400 – BumbleBee

+0

Su muestra de XML no es válida - el primer '' debe cerrarse con un '' (no lo hace - en este momento), y el '' no es válido; el 1 debe estar entre comillas: '' –

Respuesta

29

Creo que su expresión XPath está mal - probar este lugar:

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) 

O aún más simple:

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

funciona para mí con el patrón XML das

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); 

Existe método es muy útil también. Yo uso NULLIF para cambiar 0 a NULL (que es poco lo que necesitaría CAST con SUM)

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

Editar, después de la actualización

El XML informados está mal también.

no especifica la nota fundamental correctamente:

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); 
Cuestiones relacionadas