2009-03-27 7 views
6

Mogę znaleźć wiele przykładów, jak zaimportować niektóre typy danych XML do SQL Server 2005. Ale dostałem dane w następującym formacie (powtarzając "wiersz" i "komórka" z ID zamiast tagów został nazwany etc:Importowanie XML do 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> 

Idealnie chcę, aby załadować go na stole, takie jak:

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 
) 

czy ktoś może podać mi przykład lub punktu do kierunku samouczku online

Odpowiedz

1

Możesz to zrobić za pomocą OPENXML i XQUERY.

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 

Wyniki:

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 

Nie jestem pewien, co chcesz zaludnionych w 'UserString', ale można sortować że później.

Mam nadzieję, że stanowi to odpowiednie rozwiązanie dla Twojego pytania.

- Przepraszam, gbn, prawdopodobnie masz rację co do sp_xml_preparedocument. Po prostu podjąłem takie podejście z niektórych podobnych zapisanych procesów, które mieliśmy w projekcie, nad którym pracowaliśmy z zespołem Microsoft SDC, więc uznaliśmy, że będzie bezpieczny. Podejście jest zapewne czystsze.

+0

Nie ma potrzeby korzystania sp_xml_preparedocument w SQL 2005 zmiany manipulacyjne – gbn

+0

XML są jednym z lepszych cech SQL Server 2005 ... :-) – gbn

9

xml powinien być "" nie "wewnętrznie", nie?

W każdym razie można parsować typ danych XML natywnie. sp_xml_preparedocument jest szczerze niebezpieczny ze względu na obciążenie związane z pamięcią.

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)