2009-11-29 10 views
3

J'ai écrit un assembly CLR qui exporte les données d'une table vers un fichier XML. Maintenant, je veux importer ces données dans une table temporaire sur une autre instance. La structure du fichier XML est comme ceci:Analyse et importation XML dans une table dans SQL Server

<row> 
    <SystemInformationID>1</SystemInformationID> 
    <Database_x0020_Version>10.00.80404.00</Database_x0020_Version> 
    <VersionDate>2008-04-04T00:00:00</VersionDate> 
    <ModifiedDate>2008-04-04T00:00:00</ModifiedDate> 
</row> 

Je veux que le XML à analyser dans l'emplacement de destination et importé dans une table temporaire. J'ai aussi la table principale, donc je peux obtenir la structure de la table à partir de là. Y a-t-il un moyen? J'utilise OPENXML mais il ne semble pas fonctionner correctement. Je peux lire le fichier XML dans une table, qui sera stockée dans une colonne avec le type de données XML. Mon problème est l'analyse des données dans cette colonne. Ce est une tentative temporaire:

CREATE TABLE ##T (IntCol int, XmlCol xml) 
GO 

INSERT INTO ##T(XmlCol) 
SELECT * FROM OPENROWSET(
    BULK 'c:\HISOutput.xml', 
    SINGLE_CLOB) AS x 
--works correctly up to this point 

DECLARE @x xml 
DECLARE @id int 
SELECT @x=XmlCol FROM ##T 

EXEC sp_xml_preparedocument @id OUTPUT, @x 

SELECT * 
FROM  OPENXML (@id,'/row',2) 
WITH 
dbo.awbuildversion 

--I used dbo.awbuildversion table from AdventureWorks DB for testing 
this doesn't show the first column no matter how I change the OPENXML instruction. 

tx à l'avance

+0

Si vous n'indentez pas votre xml au moins 4 espaces du logiciel SO mange les personnages <et>. Je l'ai réparé pour vous. –

+0

tx Jim, ne savait pas que – Saba

+0

ou tout simplement surligner vos lignes de code, puis appuyez sur le bouton "code" (101 010) sur la barre d'outils de l'éditeur pour obtenir le "code de formatage" –

Répondre

3

Je ne suis pas tout à fait sûr de ce que vous voulez, parce que votre commentaire à la réponse OMG Ponies est différent à votre question. Quel est le problème avec la structure de table/table temporaire?

De toute façon, je ne voudrais pas utiliser OPENXML ou sp_xml_preparedocument sur SQL Server 2050 et supérieur (que vous avez je suppose parce que vous avez mentionné CLR) en raison du risque de fuite de mémoire.

En outre, si vous avez besoin de la table stucture vous pouvez ensuite utiliser INTO #tempTable

DECLARE @foo xml 

SET @foo = '<row> 
    <SystemInformationID>1</SystemInformationID> 
    <Database_x0020_Version>10.00.80404.00</Database_x0020_Version> 
    <VersionDate>2008-04-04T00:00:00</VersionDate> 
    <ModifiedDate>2008-04-04T00:00:00</ModifiedDate> 
</row>' 

SELECT 
    bar.value('./SystemInformationID[1]','INT') AS 'SystemInformationID', 
    bar.value('./Database_x0020_Version[1]','VARCHAR(14)') AS 'Database_x0020_Version', 
    bar.value('./VersionDate[1]','DATETIME') AS 'VersionDate', 
    bar.value('./ModifiedDate[1]','DATETIME') AS 'ModifiedDate' 
INTO #tempTable -- This? 
FROM 
    @foo.nodes('/row') AS foo(bar)  --use nodes not OPENXML 
+1

tx pour le conseil sur OPENXML et sp_xml_preparedocument. Je vais garder cela à l'esprit. Mon problème est dans la clause select. Je veux remettre le script à notre développeur et il l'exécutera pour différentes tables dans différentes bases de données. Ce sera inefficace si je dois écrire toute la structure de la table dans ma commande select pour chaque table. Je veux générer un fichier XML modèle (si possible) pour chaque table, ou utiliser la structure de table existante dans le site de destination (nous avons la base de données dans chaque site, avec la même structure) – Saba

+0

@Saba: tout ce que je peux suggérer dans les schémas xml pour façonner les données lorsque vous le sélectionnez. Je n'ai pas utilisé alors moi-même. Cependant, SQL est fortement défini et typé, et cela n'a aucun sens que la même requête xml/query renvoie des colonnes différentes dans des situations différentes. À moins que vous n'ayez un fichier XML différent par table cible – gbn

+0

@gbn: Je ne voulais pas dire que la même requête renvoie des résultats différents. ce que je voulais dire, c'est que la même requête est exécutée pour différentes tables avec des structures différentes, et je ne veux pas taper la structure de la table chaque fois que la requête est exécutée pour différentes tables. Je veux utiliser, pour chaque table, sa propre structure, ou un schéma xml généré spécifique à cette table. – Saba

Questions connexes