2009-03-27 11 views
6

Ich kann viele Beispiele zum Importieren bestimmter Arten von XML-Daten in SQL Server 2005 finden. Aber ich habe Daten im folgenden Format (Wiederholung "Zeile" und "Zelle" mit IDs) gegeben anstelle der Tags worden usw. genannt:Importieren von XML in SQL Server

<?xml version="1.0"?> <rows> 
    <row id='1'> 
     <cell id='category'>Simple</cell> 
     <cell id='query'>summary</cell> 
     <cell id='clientsfound'>6</cell> 
     <cell id='eligibleclients'>11</cell> 
     <cell id='percentage'>55</cell> 
     <cell id='days'>0</cell> 
    </row> 

    <row id='2'> 
     <cell id='category'>Complex</cell> 
     <cell id='query'>details</cell> 
     <cell id='clientsfound'>4</cell> 
     <cell id='eligibleclients'>6</cell> 
     <cell id='percentage'>67</cell> 
     <cell id='days'>5</cell> 
    </row> 

    ... 
    </rows> 

Im Idealfall, wie ich will es in eine Tabelle laden:

CREATE TABLE [dbo].[QueryResults](
    [UserString] [varchar](50) NULL, 
    [ImportStamp] [timestamp] NULL, 
    [RowID] [int] NULL, 
    [Category] [nchar](10) NULL, 
    [Query] [nchar](10) NULL, 
    [ClientsFound] [int] NULL, 
    [EligibleClients] [int] NULL, 
    [Percentage] [int] NULL, 
    [Days] [int] NULL 
) 

jemand mich mit einem Beispiel oder Punkt zu einem Online-Tutorial zur Verfügung stellen kann

Antwort

1

Sie können dies mit OPENXML und XQUERY tun.

DECLARE @XMLdoc XML 
DECLARE @idoc int 
SELECT @XMLdoc = '<?xml version="1.0"?> 
    <rows> 
    <row id="1"> 
     <cell id="category">Simple</cell> 
     <cell id="query">summary</cell> 
     <cell id="clientsfound">6</cell> 
     <cell id="eligibleclients">11</cell> 
     <cell id="percentage">55</cell> 
     <cell id="days">0</cell> 
    </row> 
    <row id="2"> 
     <cell id="category">Complex</cell> 
     <cell id="query">details</cell> 
     <cell id="clientsfound">4</cell> 
     <cell id="eligibleclients">6</cell> 
     <cell id="percentage">67</cell> 
     <cell id="days">5</cell> 
    </row> 
    </rows>' 


-- Create an internal representation of the XML document. 
EXEC sp_xml_preparedocument @idoc OUTPUT, @XMLDoc 

INSERT INTO QueryResults (RowID,Category,Query,ClientsFound,EligibleClients,Percentage,Days) 
SELECT id, 
     overflow.value('(/row/cell[@id="category"])[1]', 'nchar(10)'), 
     overflow.value('(/row/cell[@id="query"])[1]', 'nchar(10)'), 
     overflow.value('(/row/cell[@id="clientsfound"])[1]', 'int'), 
     overflow.value('(/row/cell[@id="eligibleclients"])[1]', 'int'), 
     overflow.value('(/row/cell[@id="percentage"])[1]', 'int'), 
     overflow.value('(/row/cell[@id="days"])[1]', 'int') 
FROM OPENXML (@idoc, '/rows/row',10) 
WITH (id int '@id', 
    overflow xml '@mp:xmltext' --the row xml node 
) 

-- Release resources allocated for the XML document. 
EXEC sp_xml_removedocument @idoc 

SELECT * FROM QueryResults 

Ergebnisse:

UserString ImportStamp  RowID Category Query ClientsFound EligibleClients Percentage Days 
----------- ------------------ ------ --------- -------- ------------ --------------- ----------- ---- 
NULL  0x000000000000C1CA 1  Simple summary 6   11    55   0 
NULL  0x000000000000C1CB 2  Complex details 4   6    67   5 

Ich bin mir nicht sicher, was Sie in 'UserString' bevölkerten wollen, aber Sie können das später aussortieren.

Hoffe das bietet eine geeignete Lösung für Ihre Frage.

- Tut mir leid, gbn, Sie haben wahrscheinlich Recht über sp_xml_preparedocument. Ich habe diesen Ansatz von einigen ähnlichen gespeicherten Procs übernommen, die wir in einem Projekt hatten, mit dem wir mit dem Microsoft SDC-Team gearbeitet hatten, und dachten, es wäre sicher. Ihr Ansatz ist wahrscheinlich sowieso sauberer.

+0

Keine Notwendigkeit sp_xml_preparedocument in SQL 2005 – gbn

+0

XML-Handling Änderungen sind eine der besseren Funktionen von SQL Server 2005 zu verwenden ... :-) – gbn

9

Die XML sollte "" nicht intern sein, nein?

Wie auch immer, Sie können den XML-Datentyp nativ analysieren. sp_xml_preparedocument ist ehrlich gesagt wegen des Overheads der Speichernutzung gefährlich.

DECLARE @foo XML; 

SET @foo = N'<?xml version="1.0"?> 
<rows> 
    <row id="1"> 
     <cell id="category">Simple</cell> 
     <cell id="query">summary</cell> 
     <cell id="clientsfound">6</cell> 
     <cell id="eligibleclients">11</cell> 
     <cell id="percentage">55</cell> 
     <cell id="days">0</cell> 
    </row> 
    <row id="2"> 
     <cell id="category">Complex</cell> 
     <cell id="query">details</cell> 
     <cell id="clientsfound">4</cell> 
     <cell id="eligibleclients">6</cell> 
     <cell id="percentage">67</cell> 
     <cell id="days">5</cell> 
    </row> 
</rows>'; 

SELECT 
    x.item.value('@id', 'int') AS RowID, 
    y.item.value('(./cell[@id="category"])[1]', 'nchar(10)') AS category, 
    y.item.value('(./cell[@id="query"])[1]', 'nchar(10)') AS query, 
    y.item.value('(./cell[@id="clientsfound"])[1]', 'int') AS clientsfound, 
    y.item.value('(./cell[@id="eligibleclients"])[1]', 'int') AS eligibleclients, 
    y.item.value('(./cell[@id="percentage"])[1]', 'int') AS percentage, 
    y.item.value('(./cell[@id="days"])[1]', 'int') AS days 
FROM 
    @foo.nodes('/rows/row') x(item) 
    CROSS APPLY 
    x.item.nodes('.') AS y(item)