Разбор и импорт XML в таблицу в SQL Server - PullRequest
3 голосов
/ 29 ноября 2009

Я написал сборку CLR, которая экспортирует данные таблицы в файл XML. Теперь я хочу импортировать эти данные во временную таблицу на другом экземпляре. Структура файла XML выглядит следующим образом:

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

Я хочу, чтобы XML был проанализирован в месте назначения и импортирован во временную таблицу. У меня тоже есть главная таблица, так что я могу получить структуру таблицы оттуда. Есть ли способ? Я использую OPENXML, но, похоже, он работает неправильно. Я могу прочитать файл XML в таблицу, которая будет храниться в столбце с типом данных XML. Моя проблема - анализ данных в этом столбце. Это временная попытка:

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 заранее

1 Ответ

3 голосов
/ 29 ноября 2009

Я не совсем уверен, что вы хотите, потому что ваш комментарий к ответу OMG Ponies отличается от вашего вопроса. В чем проблема с временной таблицей / структурой таблицы?

В любом случае, я бы не стал использовать OPENXML или sp_xml_preparedocument на SQL Server 2050 и выше (что, как вы предполагаете, вы упомянули в CLR) из-за риска утечки памяти.

Также, если вам нужна структура таблицы, вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...