2011-03-25 12 views
9

मैं किसी XML फ़ील्ड में नोड्स की गिनती प्राप्त करने का प्रयास कर रहा हूं। लेकिन मैं परिणाम के रूप में हमेशा 0 देखता हूं। यहां बताया गया है कि मेरी क्वेरी कैसी दिखती है।किसी XML फ़ील्ड में नोड्स की गिनती प्राप्त करें XQuery SQL Server 2008

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

क्या क्या एक्सएमएल दिखता है? शून्य का मतलब है कि आप क्रॉस आवेदन से कोई पंक्ति नहीं ... – gbn

+0

@gbn। जब मैं @XmlTable से * का चयन करता हूं, तो मैं संस्करण आईडी = 400 – BumbleBee

+0

के लिए कम से कम 3 पुस्तक तत्व देखता हूं आपका एक्सएमएल नमूना मान्य नहीं है - पहले ' 'को' '(यह अभी नहीं है) के साथ बंद होना चाहिए, और '<संस्करण संख्या = 1>' मान्य नहीं है - 1 को उद्धरणों में होना आवश्यक है: '<संस्करण संख्या =" 1 ">' –

उत्तर

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

एक्सएमएल पैटर्न के साथ मेरे लिए काम करता है आप दे

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

मौजूद विधि भी काफी उपयोगी है: जैसे


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

मेरे एक्सएमएल लग रहा है। मैं NULLIF का उपयोग शून्य करने के लिए 0 बदलने के लिए

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

संपादित करें, अद्यतन

एक्सएमएल आप पोस्ट भी गलत है के बाद (यह थोड़ा इसलिए योग के साथ कास्ट की आवश्यकता होगी है)।

आप सही ढंग से मूल नोट निर्दिष्ट नहीं कर रहे:

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); 
संबंधित मुद्दे