SQL Server 2008 - импортировать часть файла XML - PullRequest
1 голос
/ 05 ноября 2010

Я импортировал весь XML-файл во временную таблицу с типом данных XML, используя приведенный ниже код

   INSERT
   INTO import.XMLCompanyDetail
     (
     XMLData
     )

   SELECT BulkColumn AS XMLData
   FROM OPENROWSET (BULK '\\Server\Dir1\Dir2\Dir3\ExampleXML.xml', SINGLE_BLOB) AS XMLDATA

Однако я стараюсь импортировать только часть данных, пожалуйста.см. ниже пример XML.В идеале я хотел бы выбрать CoNum 123 или CoNum 233 и получить остальные данные в этом элементе.Хотя я предполагаю, что это будет как-то означать то, что мы получим Row Num Num и будем работать оттуда.

<VN>
  <CompanyList>
    <Row num="1">
      <CoNum>123</CoNum>
      <CoName>Comp1</CoName>
      <DInc>1950-01-06</DInc>
    </Row>
    <Row num="2">
      <CoNum>233</CoNum>
      <CoName>Comp2</CoName>
      <DInc>1955-11-10</DInc>
      <DDis />
    </Row>
  </CompanyList>
</VN>

, если кто-то может использовать такой синтаксис или указать мне правильное направление, это будет очень цениться.

Также стоит отметить, что в процессе я собираю данные в таблицу позже, но к этому моменту уже поздно, поэтому действительно нужно удалить остальные данные или выбрать только соответствующие данные в этомзапрос или из таблицы import.XMLCompanyDetail.

ОБНОВЛЕНИЕ 1: Нашли эту ссылку http://www.simple -talk.com / sql / t-sql-программирования / xml-data -ification-language-workbench / , которая должна помочь.

ОБНОВЛЕНИЕ 2: Я в конечном итоге кодировал ниже, возможно, не самый элегантный, но, кажется, работает.Потратил добрых десять минут, пытаясь передать переменную через параметр sp_executeSQL, но не смог заставить его работать, поэтому просто выбил нижеприведенное ... добавит QUOTENAME в какой-то момент перед началом работы.

                        SET @SQL = 
                                N'                                      
                                UPDATE  import.XMLCompanyDetail
                                SET     XMLData.modify(''delete (//VN/CompanyList/Row[@num != ' + CONVERT(VARCHAR,@RowNum) + '])'')
                                '

                        EXECUTE SP_EXECUTESQL   @SQL

Ответы [ 2 ]

1 голос
/ 05 ноября 2010

Как насчет этого:

SELECT
    cd.ID, -- or something
    CL.Row.value('(CoNum)[1]', 'int') AS 'CoNum',
    CL.Row.value('(CoName)[1]', 'varchar(100)') AS 'CoName',
    CL.Row.value('(DInc)[1]', 'datetime') AS 'DInc'
FROM
    import.XMLCompanyDetail cd
CROSS APPLY
    cd.XMLData.nodes('/VN/CompanyList/Row') CL(ROW)
WHERE
    CL.Row.value('(@num)', 'int') = 1

По сути, вы создаете «псевдотаблица» CL.ROW из списка /VN/CompanyList/Row записей в вашем XML, а затем XQuery эта псевдотаблица для соответствующей информации, которая вас интересует.

0 голосов
/ 09 ноября 2010

Пожалуйста, смотрите обновление 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...