Добрый вечер,
Есть целевая задача, которая требует загрузить данные из Excel файла в существующую таблицу на SQL-сервере.
Перед реальной загрузкой (по сути это будет merge) необходимо будет выполнить валидацию в 2 этапа:
1. Валидация метаданных (надеюсь правильно выражаю суть этим словом) excel-файла с помощью T-SQL;
2. Валидация данных excel-файла с помощью T-SQL перед выполнением Merge с существующей таблицей.
Оба случая требуют выполнения логирования, т.е. записать, что было не так с файлом и данными в нем.
Второй этап я пока что опущу, т.к. особой сложности в нем не вижу, но есть некие вопросы, которые скорее всего озвучу в другой теме позже.
Итак, первый этап - валидация метаданных.
Мои вводные:
1. Структура Excel-файла предопредела заранее, но, как это часто бывает, что-то может пойти не так и могут потеряться столбцы, их названия, их порядок в файле и т.д. Вот это я должен проверить, что загружаемый файл соответствует требованиям.
Предположим файл состоит из 7 столбцов со следующими названиями и типами:
- ID (int)
- Name (nvarchar(256))
- Address (nvarachar(512))
- Phone (nvarchar(24))
- Col1 (bigint)
- Col2 (numeric(15, 4))
- Col3 (bit)
Если какой-то столбец пропал в файле, то я должен это записать в таблицу логов
Если название у какого-то из столбцов не соответствует требованиям - аналогично записываю.
Если тип (можно попытаться по данным определять) не соответствует требованиям - также пишу в лог.
Если порядок столбцов нарушен - аналогично пишу в лог.
Как только Excel-файл будет соответствовать на все 100% требованиям я смогу перейти ко второму этапу.
Данные всегда будут находится на первой странице файла.
Грузить данные я могу исключительно 2 способами:
1. С помощью CLR-функции
2. С помощью Linked Server через openquery
SSIS отпадает сразу, поэтому не стоит предлагать его.
Пытался по разному спрашивать гугл, но ничего не помогло...
Буду благодарен за любые подсказки.
Из того, что мне удалось сейчас придумать - это непосредственная загрузка имеющихся данных из Excel-файла во временную таблицу (через CLR или Linked Server), где далее я по имени этой временной таблицы обращаюсь в базе tempdb к обьекту sys.columns и получаю список названий столбцов, которые были в файле с их порядком. После этого делаю с помощью конструктура табличных выражений свою эталонную таблицу с порядком столбцов и их названиями и к этому результату применяю EXCEPT отсортированного результата из sys.columns. То есть сравниваю порядки с их названиями и если где-то не совпало, то я считаю, что структура не корректна.
Мне кажется, что должно существовать более красивое решение этой задачи.
Может кто знает его или подскажет где поискать?
Если каких-то данных не хватает, то напишите.
Спасибо!
Есть целевая задача, которая требует загрузить данные из Excel файла в существующую таблицу на SQL-сервере.
Перед реальной загрузкой (по сути это будет merge) необходимо будет выполнить валидацию в 2 этапа:
1. Валидация метаданных (надеюсь правильно выражаю суть этим словом) excel-файла с помощью T-SQL;
2. Валидация данных excel-файла с помощью T-SQL перед выполнением Merge с существующей таблицей.
Оба случая требуют выполнения логирования, т.е. записать, что было не так с файлом и данными в нем.
Второй этап я пока что опущу, т.к. особой сложности в нем не вижу, но есть некие вопросы, которые скорее всего озвучу в другой теме позже.
Итак, первый этап - валидация метаданных.
Мои вводные:
1. Структура Excel-файла предопредела заранее, но, как это часто бывает, что-то может пойти не так и могут потеряться столбцы, их названия, их порядок в файле и т.д. Вот это я должен проверить, что загружаемый файл соответствует требованиям.
Предположим файл состоит из 7 столбцов со следующими названиями и типами:
- ID (int)
- Name (nvarchar(256))
- Address (nvarachar(512))
- Phone (nvarchar(24))
- Col1 (bigint)
- Col2 (numeric(15, 4))
- Col3 (bit)
Если какой-то столбец пропал в файле, то я должен это записать в таблицу логов
Если название у какого-то из столбцов не соответствует требованиям - аналогично записываю.
Если тип (можно попытаться по данным определять) не соответствует требованиям - также пишу в лог.
Если порядок столбцов нарушен - аналогично пишу в лог.
Как только Excel-файл будет соответствовать на все 100% требованиям я смогу перейти ко второму этапу.
Данные всегда будут находится на первой странице файла.
Грузить данные я могу исключительно 2 способами:
1. С помощью CLR-функции
2. С помощью Linked Server через openquery
SSIS отпадает сразу, поэтому не стоит предлагать его.
Пытался по разному спрашивать гугл, но ничего не помогло...
Буду благодарен за любые подсказки.
Из того, что мне удалось сейчас придумать - это непосредственная загрузка имеющихся данных из Excel-файла во временную таблицу (через CLR или Linked Server), где далее я по имени этой временной таблицы обращаюсь в базе tempdb к обьекту sys.columns и получаю список названий столбцов, которые были в файле с их порядком. После этого делаю с помощью конструктура табличных выражений свою эталонную таблицу с порядком столбцов и их названиями и к этому результату применяю EXCEPT отсортированного результата из sys.columns. То есть сравниваю порядки с их названиями и если где-то не совпало, то я считаю, что структура не корректна.
Мне кажется, что должно существовать более красивое решение этой задачи.
Может кто знает его или подскажет где поискать?
Если каких-то данных не хватает, то напишите.
Спасибо!