2009-03-27 6 views
6

Я могу найти множество примеров того, как импортировать определенные типы данных XML в SQL Server 2005. Но мне дали данные в следующем формате (повторяя «строка» и «ячейка» с идентификаторами вместо тегов были названы и т.д.:Импорт XML в SQL-сервер

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

Может кто-то дать мне пример или точки в направлении онлайн учебник

ответ

1

Вы можете сделать это с помощью OPENXML и 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 

Результаты:

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 

Я не уверен, что вы хотите, населенная в 'UserString', но вы можете сортировать, что позже.

Надеюсь, это даст вам подходящее решение.

- Извините, gbn, вы, вероятно, прав насчет sp_xml_preparedocument. Я просто взял этот подход из некоторых подобных хранимых процедур, которые мы имели в проекте, над которым мы работали с командой Microsoft SDC, поэтому подумал, что это будет безопасно. В любом случае, вы, возможно, более чисты.

+0

Нет необходимости использовать sp_XML_preparedocument в SQL 2005 изменения погрузо – gbn

+0

XML являются одним из лучших особенностей SQL Server 2005 ... :-) – gbn

9

xml должен быть "" не "внутренне, нет?

В любом случае, вы можете проанализировать XML-тип данных изначально. sp_xml_preparedocument откровенно опасен из-за накладных расходов на использование памяти.

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)