Массовая вставка в SQL Server 2008 R2 из данных XML RAW - PullRequest
1 голос
/ 06 февраля 2012

У меня есть структура XML, подобная следующей:

<tables>
  <table name="tableName1">
    <row ID="34" col1="data" col2="dom" />
    <row ID="35" col1="data2" col2="dom2" />
  </table>
  <table name="tableName2">
    <row ID="1" col1="data" col2="dom" col3="item1" />
    <row ID="3" col1="data2" col2="dom2" col3="item2" />
    <row ID="7" col1="data4" col3="item3" />
  </table>
  ...
<tables>

В основном узлы таблицы содержат данные RAW, созданные путем выбора FOR XML RAW.

Теперь я хочу сделать обратное: прочитать XML и вставить данные в соответствующие таблицы базы данных SQL Server 2008 R2. Однако я хочу, чтобы процесс загрузки был устойчивым, то есть я не хочу связываться с именами столбцов и таблиц, если они изменятся в будущем. Мне нужен процесс для чтения имен таблиц из @name атрибутов узлов таблицы и вставки данных в столбцы, заданные атрибутами в <Row> узлах. Я подумал о хранимой процедуре, которая получает XML в качестве входных данных и делает все остальное.

Количество данных составляет ок. 70 таблиц от 10 до 30 000 строк, всего не более 100 000 строк. Мне нужно сделать это максимально эффективно, лучше всего будет массовая загрузка.

Процесс не должен заботиться о внешних ключах, так как порядок таблиц внутри XML построен так, что ограничения FK могут сохраняться при загрузке одной таблицы за другой.

Однако в каждой таблице есть столбцы идентификаторов, поэтому я должен сделать

SET Identity_Insert ON and SET Identity_Insert OFF

до и после обработки каждой таблицы. Мне также нужно повторно заполнить каждую таблицу после вставки всех строк. О, и мне нужно сделать весь шебанг в транзакции, чтобы я мог откатиться, если что-то пойдет не так.

В какую сторону вы предлагаете мне пойти: мне остаться с T-SQL или попытаться написать SP в CLR SQL? Должен ли я использовать XQuery или использовать метод массовой вставки?

Спасибо за помощь!

Ответы [ 2 ]

2 голосов
/ 06 февраля 2012

По сути, вам придется пройтись по XML и написать запросы на основе результирующего набора.

Попробуйте начать:

declare @i int;
declare @x xml;

------
SELECT @x = N'
<tables>
  <table name="tableName1">
    <row ID="34" col1="data" col2="dom" />
    <row ID="35" col1="data2" col2="dom2" />
  </table>
  <table name="tableName2">
    <row ID="1" col1="data" col2="dom" col3="item1" />
    <row ID="3" col1="data2" col2="dom2" col3="item2" />
    <row ID="7" col1="data4" col3="item3" />
  </table>
</tables>';


exec sp_xml_preparedocument @i output, @x


select ID, col1, col2
from OpenXml(@i, '/tables/table/row')
with (ID int, col1 nvarchar(30), col2 nvarchar(30))

exec sp_xml_removedocument @i

Он выдаст вам список столбцов, в которые нужно вставить данные (вы можете получить имена таблиц на один уровень раньше, просто изменив SQL)

34  data    dom
35  data2   dom2
1   data    dom
3   data2   dom2
7   data4   NULL

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

К вашему сведению, вам не нужно писать XML, вы можете прочитать из файла, подобного этому:

SELECT @x = xCol.BulkColumn FROM OPENROWSET (BULK 'c:\Update.xml', SINGLE_BLOB) AS xCol;
1 голос
/ 10 февраля 2012

Поскольку вы имеете дело с довольно большими документами XML, на этом этапе я рекомендую использовать .net-шредер. Вы можете сделать это с помощью процедуры CLR или внешнего инструмента. Вы также можете использовать встроенную в xquery SQL Server, но это будет медленно.

Однако, глядя на этот и ваш предыдущий вопрос ( Скопируйте данные в один XML-файл из MS SQL Server 2008 R2 ), я думаю, что вам лучше использовать что-то вроде утилиты BCP или даже репликации , Каковы ваши точные требования?

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