2010-12-09 4 views
1

Mes données de lecture de fichier XML à l'aide d'OPENXML dans SQL Server.OPENXML - SQL Server

Il y a un léger problème à cela. Voici une partie de fichier xml

<Name_Address> 
    <name>JCB SALES PVT</name> 
    <address>24, SALAROURIA ARENA ADUGODI</address> 
    <address>HOSUR MAIN ROAD, Honolulu</address> 
    <country>N</country> 
</Name_Address> 

et ma requête SQL est

SELECT 
    @address = CONVERT(VARCHAR(150), [TEXT]) 
FROM OPENXML(@idoc,'/Name_Address/address', 0) 
WHERE [text] IS NOT NULL 

En adresse Email Je reçois la dernière adresse valeur de la balise à savoir

HOSUR MAIN ROAD, Honolulu 

Mais il devrait être

24, SALAROURIA ARENA ADUGODI, HOSUR MAIN ROAD, Honolulu 

Comment puis-je y parvenir? Aidez-moi, guidez-moi pour ce faire.

concernant

+0

Quelle ** version ** de SQL Server utilisez-vous? –

+0

J'utilise sql 2000. – Humdum

+0

Bien formulé question, et en répondant j'ai appris quelque chose. +1 –

Répondre

2

Votre problème n'est pas spécifiquement à faire pour avec OPENXML.

Votre requête ...

SELECT CONVERT(VARCHAR(150), [TEXT]) 
FROM OPENXML(@idoc,'/Name_Address/address', 0) 
WHERE [text] IS NOT NULL 

... retourne plusieurs lignes. Ainsi, lorsque vous affectez une variable, elle prend uniquement la dernière des lignes renvoyées.

J'ai mis en place un exemple qui utilise un curseur pour itérer. Il comprend votre document d'exemple. Vous pouvez le coller directement dans Query Analyzer (2000)/Management Studio (2005+) et il sera exécuté. tout ce que vous avez à faire est d'ajouter vos virgules et vos espaces (je viens d'utiliser un espace).

DECLARE @hdoc int 
DECLARE @doc varchar(1000) 
DECLARE @address varchar(150) 
DECLARE @thisaddress varchar(150) 
set @address = '' 
SET @doc =' 
<Name_Address> 
    <name>JCB SALES PVT</name> 
    <address>24, SALAROURIA ARENA ADUGODI</address> 
    <address>HOSUR MAIN ROAD, Honolulu</address> 
    <country>N</country> 
</Name_Address>' 

EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc 

DECLARE addr_cursor CURSOR 
    FOR SELECT CONVERT(VARCHAR(150), [TEXT]) 
    FROM OPENXML(@hdoc,'/Name_Address/address', 0) 
    WHERE [text] IS NOT NULL 

--select @@FETCH_STATUS 
OPEN addr_cursor 
FETCH NEXT FROM addr_cursor INTO @thisaddress 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    set @address = @address+ @thisaddress + ' ' 
    FETCH NEXT FROM addr_cursor INTO @thisaddress 
END 

select @address 

CLOSE addr_cursor 
DEALLOCATE addr_cursor 

exec sp_xml_removedocument @hdoc 
+0

cela fonctionne. Comment vous êtes venu à savoir à ce sujet. ce que je veux savoir Comment une personne peut-elle augmenter ses compétences et sa capacité de programmation? Si vous pouvez me guider, la meilleure façon de Self Help? – Humdum

+0

@Humdum - Pourriez-vous marquer ceci comme accepté en cliquant sur la coche. Très difficile de répondre à votre question de compétence/capacité. L'expérience et un esprit curieux aident. Par exemple, je n'avais même pas entendu parler d'OPENXML sur SQL Server, mais je l'ai cherché et j'ai écrit un exemple rapide. J'ai décidé de voir ce qui se passerait si je faisais un select, au lieu d'une affectation sur votre instruction 'SELECT @address = ....' d'origine. Cela a révélé que les deux lignes étaient retournées, donc j'ai déduit que seul le dernier était en train d'être défini. Il y a beaucoup plus sur l'expérience, etc ici sur StackOverflow, et http://programmers.stackexchange.com/. –