Импорт из XML файла в таблицу MS SQL

868
28 ноября 2016, 18:42

Приветствую!

Есть задачка по импорту ряда справочников формата DBF в MS SQL Server 2008 из приложения на C#. Ситуация осложняется тем, что я могу делать импорт данных только через хранимые процедуры на сервере, так как у самого приложения может не быть прав на прямую работу с таблицами, в которые нужно добавлять данные. Потому, например, System.Data.SqlClient.SqlBulkCopy не очень-то подходит, как и прямые запросы через SqlCommand. Сразу скажу, что есть ограничение и на команду EXEC на сервере, т.е. динамические запросы не взлетят.

Сейчас имеется порядка 12 файлов XML, в которых лежат сконвертированные из DBF данные, это — источник. В качестве приемника используются 12 таблиц в БД MS SQL.

При этом структуры таблиц-источников и таблиц-приемников не совпадают (типы, названия полей). Обусловлено это тем, что в XML данные хранятся без явного указания типа (да, можно было бы делать схему в XSD но это не нужно, т.к. в оригинальных файлах, например, значения типа int сплошь и рядом хранятся в char, т.е. в источнике поле имеет тип char, в приемнике должно быть int).

Имена полей не совпадают по причине того, что они просто криво были названы в DBF, и в MS SQL переносить это не хотелось (например, название города в справочнике хранится в поле с названием I_GOR, в SQL БД - это же поле названо как Name).

Зато вот число полей любой таблицы-источника совпадает с числом полей аналогичной таблицы-приемника.

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

Пример:

Изначально DBF содержит поля с данными:

COD_RS (char), GOR (char), I_GOR (char)
55             000         Нью-Васюки
56             002         Гадюкино
56             007         Васюки

То после обработки получаем на выходе следующий набор полей (c данными) в XML

<?xml version="1.0" standalone="yes"?>
<DocumentElement>
  <SPRGOR>
    <ID>1</ID>
    <COD_RS>55</COD_RS>
    <GOR>000</GOR>
    <I_GOR>Нью Васюки</I_GOR>
  </SPRGOR>
  <SPRGOR>
    <ID>2</ID>
    <COD_RS>56</COD_RS>
    <GOR>002</GOR>
    <I_GOR>Гадюкино</I_GOR>
  </SPRGOR>
  <SPRGOR>
    <ID>3</ID>
    <COD_RS>56</COD_RS>
    <GOR>007</GOR>
    <I_GOR>Васюки</I_GOR>
  </SPRGOR>
</DocumentElement>

Целевая таблица имеет структуру:

ID (int, identity, PK), AreaCode (int), CityCode (int), Name (nvarchar(50))

В идеале хотелось бы сделать так, что бы первое поле из XML попадало в первое поле таблицы (ID ---> ID), второе из XML - в второе поле таблицы (COD_RS ---> AreaCode) и так далее, по числу полей. И да, с конвертацией данных при вставке в тип данных, указанных в приёмнике.

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

Всё, что я видел пока, это вставка данных в таблицу либо с учетом структуры таблиц, либо предлагается использовать мастер для импорта (с маппингом полей и типов), но использование мастеров не подходит изначально, а привязываться к структуре каждой из таблиц-источников и писать для каждой из них свою хранимку не очень хотелось бы (точнее, очень не хотелось бы).

(Генерацию XML я уже сделал, проблема в последующей загрузке этих данных на сервер)

READ ALSO
Javascript не видит PageMethods

Javascript не видит PageMethods

Написал код для тестирования работы PageMethods в Javascript и C#,но в скрипте не видит PageMethodsЭто скрипт`

530
Вызвать метод UserControl из главного окна

Вызвать метод UserControl из главного окна

В главном окне есть кнопка, при нажатии на которую должен вызваться метод , который есть в UserControl

553
ViewPager узнать смещение страницы

ViewPager узнать смещение страницы

Есть ViewPager, каким методом можно узнать отклонение от центра страницы? То есть если страница неподвижно стоит в центре, то отклонение 0Если...

571