Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Валидация метаданных excel файла с помощью T-SQL
|
|||
|---|---|---|---|
|
#18+
Добрый вечер, Есть целевая задача, которая требует загрузить данные из 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. То есть сравниваю порядки с их названиями и если где-то не совпало, то я считаю, что структура не корректна. Мне кажется, что должно существовать более красивое решение этой задачи. Может кто знает его или подскажет где поискать? Если каких-то данных не хватает, то напишите. Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2018, 22:34 |
|
||
|
Валидация метаданных excel файла с помощью T-SQL
|
|||
|---|---|---|---|
|
#18+
otets1988, это же вопрос не к сиквелу, а к умению программировать на VBA или C#. На них валидаторы и пишите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2018, 23:06 |
|
||
|
Валидация метаданных excel файла с помощью T-SQL
|
|||
|---|---|---|---|
|
#18+
Владислав Колосов, С точки зрения архитектурного подхода в целом скорее всего вы правы, но есть одно большое НО. У меня очень мало времени на эту задачу, но что еще хуже - знаний C# и VBA у меня еще меньше... Поэтому на сегодня только один вариант - T-SQL. Пусть он будет не такой железобетонный, как на C# или VBA, но будет на T-SQL. Хотелось бы более элегантное решение нежели мое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2018, 23:22 |
|
||
|
Валидация метаданных excel файла с помощью T-SQL
|
|||
|---|---|---|---|
|
#18+
otets1988, linked_server на базе провайдера от Microsoft.ACE.OLEDB.12.0 до Microsoft.ACE.OLEDB.16.0 (или может быть уже даже 17), на это дело вешаешь sp_tables_ex и sp_columns_ex ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2018, 23:52 |
|
||
|
Валидация метаданных excel файла с помощью T-SQL
|
|||
|---|---|---|---|
|
#18+
vikkiv, Спасибо. Что-то я и забыл про этих 2-х товарищей sp_tables_ex и sp_columns_ex. Еще я только что обратил внимание, что допустил некоторую неточность в исходных данных. Грузить я могу действительно только 2-мя способами - через CLR или через Linked Server, но при этом оба способа должны быть реализованы и будут выбираться в зависимости от опции. В связи с этим валидация метаданных должны быть реализована и для первого случая и для второго. Выходит, что на сейчас для CLR - это обращение к sys.columns после физической загрузки данных из Excel во временную таблицу. А для Linked Server - это комбинация из sp_tables_ex и sp_columns_ex, где я могу до начала загрузки осуществить проверку по столбцам. Исходя из этих уточнений мне придется написать процедурку, которая аналогично в зависимости от опции будет работать тем или другим способом. Насколько я выиграю от того, что реализую 2 разных обработки вместо одной (я так понимаю, что это возможно только что sys.columns в обоих случаях после реальной загрузки данных)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2018, 08:23 |
|
||
|
Валидация метаданных excel файла с помощью T-SQL
|
|||
|---|---|---|---|
|
#18+
1. Проще надо быть. 2. Тупо открываем файл Linked Server. И запрашиваем те столбцы, которые нужны. 3. Либо они есть и фсе срабатывает. 4. Либо чего-то не хватает и отгребаем ошибку. Ошибку в лог. otets19881. Если какой-то столбец пропал в файле, то я должен это записать в таблицу логов 2. Если название у какого-то из столбцов не соответствует требованиям - аналогично записываю. 3. Если тип (можно попытаться по данным определять) не соответствует требованиям - также пишу в лог. 4. Если порядок столбцов нарушен - аналогично пишу в лог. 1 - будет отработано в процессе открытия. 2 - дык, суть 1. 3 - будет отработано в процессе загрузки. 4. А вот реляционная теория дозволяет менять порядок. Вам то каким местом это вперлось? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2018, 10:02 |
|
||
|
Валидация метаданных excel файла с помощью T-SQL
|
|||
|---|---|---|---|
|
#18+
aleks222, Спасибо за ваш комментарий. Постараюсь объяснить суть моих тараканов. 1. С порядком вы правы и тут мне не чем крыть кроме своей безграмотности. Я банально забыл, что могу из openquery вернуть не просто select *, а задать конкретные имена столбцов в нужном мне порядке. В таком случае порядок столбцов в файле мне действительно не важен. Вот лень к чему приводит, что такие вещи забываю. 2. А вот просто ошибка от SQL при именованном обращении мне не совсем подходит, так как она не мне важна в логе, а обычному пользователю, который будет грузить Файлы в базу. Надо ему по-русски написать, что твой файл корявый и в нем нахватает таких-то столбцов или их названия не корректны. То есть сперва вот такой лог, а потом уже исключения от sql можно для меня. 3. С типами данных в столбцах ровно такая же проблема. Мне сперва надо пользователю сообщить, что у него, к примеру, в такой-то строке в таком-то столбце каша, которая не соответствует исходным требованиям. Мне на этом этапе уже важно отсечь такие данные и только потом их пытаться мержить. Я стараюсь быть проще, но не всегда это получается либо меня поставят в позу с такими дурацкими требованиями и тут ничего непопишешь... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2018, 10:45 |
|
||
|
Валидация метаданных excel файла с помощью T-SQL
|
|||
|---|---|---|---|
|
#18+
otets1988, Вы сейчас создадите эрзац решение и будете его развивать, т.к. бизнес постоянно меняет требования. А завтра поймете, что зашли в тупик и надо было время потратить все же на создание приложения загрузки. Это всё пройдено давным-давно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2018, 11:56 |
|
||
|
Валидация метаданных excel файла с помощью T-SQL
|
|||
|---|---|---|---|
|
#18+
otets1988, Можете сделать примерно так: Код: sql 1. 2. 3. 4. Далее анализируйте метаданные получившейся временной таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2018, 12:16 |
|
||
|
Валидация метаданных excel файла с помощью T-SQL
|
|||
|---|---|---|---|
|
#18+
Владислав Колосовotets1988, Вы сейчас создадите эрзац решение и будете его развивать, т.к. бизнес постоянно меняет требования. А завтра поймете, что зашли в тупик и надо было время потратить все же на создание приложения загрузки. Это всё пройдено давным-давно. Вы все еще создаете универсальный ковырятель в носу свое приложение для загрузки? Давно уже пора понять "т.к. бизнес постоянно меняет требования" - ничего универсального создать не получится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2018, 12:26 |
|
||
|
Валидация метаданных excel файла с помощью T-SQL
|
|||
|---|---|---|---|
|
#18+
otets1988aleks222, Спасибо за ваш комментарий. Постараюсь объяснить суть моих тараканов. 1. С порядком вы правы и тут мне не чем крыть кроме своей безграмотности. Я банально забыл, что могу из openquery вернуть не просто select *, а задать конкретные имена столбцов в нужном мне порядке. В таком случае порядок столбцов в файле мне действительно не важен. Вот лень к чему приводит, что такие вещи забываю. 2. А вот просто ошибка от SQL при именованном обращении мне не совсем подходит, так как она не мне важна в логе, а обычному пользователю, который будет грузить Файлы в базу. Надо ему по-русски написать, что твой файл корявый и в нем нахватает таких-то столбцов или их названия не корректны. То есть сперва вот такой лог, а потом уже исключения от sql можно для меня. 3. С типами данных в столбцах ровно такая же проблема. Мне сперва надо пользователю сообщить, что у него, к примеру, в такой-то строке в таком-то столбце каша, которая не соответствует исходным требованиям. Мне на этом этапе уже важно отсечь такие данные и только потом их пытаться мержить. Я стараюсь быть проще, но не всегда это получается либо меня поставят в позу с такими дурацкими требованиями и тут ничего непопишешь... 2. Дык, транслируйте ошибку пользователю в "человеческий язык". Если так за него переживаете. 3. Тут есть два пути... 1) Грузить в текст и преобразовывать в MS SQL; 2) При возникновении ошибки, методом select top(n)... и делением отрезка пополам (т.е. за log(числа строк) запросов) локализовать первую строку с ошибкой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2018, 12:31 |
|
||
|
Валидация метаданных excel файла с помощью T-SQL
|
|||
|---|---|---|---|
|
#18+
aleks222otets1988aleks222, Спасибо за ваш комментарий. Постараюсь объяснить суть моих тараканов. 1. С порядком вы правы и тут мне не чем крыть кроме своей безграмотности. Я банально забыл, что могу из openquery вернуть не просто select *, а задать конкретные имена столбцов в нужном мне порядке. В таком случае порядок столбцов в файле мне действительно не важен. Вот лень к чему приводит, что такие вещи забываю. 2. А вот просто ошибка от SQL при именованном обращении мне не совсем подходит, так как она не мне важна в логе, а обычному пользователю, который будет грузить Файлы в базу. Надо ему по-русски написать, что твой файл корявый и в нем нахватает таких-то столбцов или их названия не корректны. То есть сперва вот такой лог, а потом уже исключения от sql можно для меня. 3. С типами данных в столбцах ровно такая же проблема. Мне сперва надо пользователю сообщить, что у него, к примеру, в такой-то строке в таком-то столбце каша, которая не соответствует исходным требованиям. Мне на этом этапе уже важно отсечь такие данные и только потом их пытаться мержить. Я стараюсь быть проще, но не всегда это получается либо меня поставят в позу с такими дурацкими требованиями и тут ничего непопишешь... 2. Дык, транслируйте ошибку пользователю в "человеческий язык". Если так за него переживаете. 3. Тут есть два пути... 1) Грузить в текст и преобразовывать в MS SQL; 2) При возникновении ошибки, методом select top(n)... и делением отрезка пополам (т.е. за log(числа строк) запросов) локализовать первую строку с ошибкой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2018, 08:37 |
|
||
|
Валидация метаданных excel файла с помощью T-SQL
|
|||
|---|---|---|---|
|
#18+
Владислав Колосовotets1988, Вы сейчас создадите эрзац решение и будете его развивать, т.к. бизнес постоянно меняет требования. А завтра поймете, что зашли в тупик и надо было время потратить все же на создание приложения загрузки. Это всё пройдено давным-давно. Я понимаю и разделяю вашу позицию, но бизнес разный бывает. Поставленная задача - это очень маленький винтик, который не стоит ничего. Это не фундамент, ни база для чего-либо дальнейшего, это не самостоятельное решение, это всего лишь часть большой машины за которую готовы заплатить копейки. Я лишь со своей стороны пытаюсь в этом болоте хоть что-то сделать по-нормальному, если это возможно. Вот и обратился за советами сюда. invmotets1988, Можете сделать примерно так: Код: sql 1. 2. 3. 4. Далее анализируйте метаданные получившейся временной таблицы. Интересное решение. Я даже и близко о таком не думал. Спасибо! aleks2223. Тут есть два пути... 1) Грузить в текст и преобразовывать в MS SQL; 2) При возникновении ошибки, методом select top(n)... и делением отрезка пополам (т.е. за log(числа строк) запросов) локализовать первую строку с ошибкой. Не будет ли этот путь стоит дороже по сравнению с анализом данных из sp_columns_ex/sys.columns? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2018, 08:40 |
|
||
|
Валидация метаданных excel файла с помощью T-SQL
|
|||
|---|---|---|---|
|
#18+
otets1988 aleks2223. Тут есть два пути... 1) Грузить в текст и преобразовывать в MS SQL; 2) При возникновении ошибки, методом select top(n)... и делением отрезка пополам (т.е. за log(числа строк) запросов) локализовать первую строку с ошибкой. Не будет ли этот путь стоит дороже по сравнению с анализом данных из sp_columns_ex/sys.columns? Интересуюсь, Сонечка, чаво вы там собираетесь "анализировать"? Или наивно полагаете, что сервер чудесным образом корректность данных в столбцах экселя проверит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2018, 10:03 |
|
||
|
Валидация метаданных excel файла с помощью T-SQL
|
|||
|---|---|---|---|
|
#18+
aleks222, Да нет, что вы... Я там не тип собрался проверять, а лишь названия полей. Тип я буду по данным проверять. К примеру, если столбец должен быть числовые, то примитивной к данным в этом столбце применю isnumeric. Если длина текстового поля должна быть фиксированной, то через функцию Len посчитаю не вышел ли я за пределы и так далее в таком же духе изврат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2018, 10:10 |
|
||
|
Валидация метаданных excel файла с помощью T-SQL
|
|||
|---|---|---|---|
|
#18+
А не проще ли это логику сделать таксказать на клиенте, тоесть в Excel файле с помощью VBA и с помощью него же писать лог в Sql-таблицу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2018, 10:19 |
|
||
|
Валидация метаданных excel файла с помощью T-SQL
|
|||
|---|---|---|---|
|
#18+
Santa89, Клиент генерирует excel файл в своей программе и далее выгржает на фтп. В эту часть никто не будет лезть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2018, 10:24 |
|
||
|
Валидация метаданных excel файла с помощью T-SQL
|
|||
|---|---|---|---|
|
#18+
Santa89А не проще ли это логику сделать так сказать на клиенте, то есть в Excel файле с помощью VBA и с помощью него же писать лог в Sql-таблицу? И в нем же подключить ADO и сразу писать в целевую таблицу, и отметочку ставить "(не)загружено". Но автор хочет через TSQL. (с) Шурик, вы комсомолец? Это же не наш метод. Где гуманизм? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2018, 10:34 |
|
||
|
Валидация метаданных excel файла с помощью T-SQL
|
|||
|---|---|---|---|
|
#18+
otets1988Santa89, Клиент генерирует excel файл в своей программе и далее выгржает на фтп. В эту часть никто не будет лезть. Будете ТЗ из себя выдавливать потихоньку? SSIS пробовали использовать? Там все есть из коробки - и заберет с FTP, и метаданные валидирует, и в случае ошибки в лог запишет, и даже email с sms отправить сможет - даже думать не нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2018, 10:37 |
|
||
|
Валидация метаданных excel файла с помощью T-SQL
|
|||
|---|---|---|---|
|
#18+
Руслан Дамировичotets1988Santa89, Клиент генерирует excel файл в своей программе и далее выгржает на фтп. В эту часть никто не будет лезть. Будете ТЗ из себя выдавливать потихоньку? SSIS пробовали использовать? Там все есть из коробки - и заберет с FTP, и метаданные валидирует, и в случае ошибки в лог запишет, и даже email с sms отправить сможет - даже думать не нужно. Про SSIS я сразу написал. otets1988SSIS отпадает сразу, поэтому не стоит предлагать его. Если каких-то данных не хватает, то напишите. Задача - валидация исключительно силами T-SQL. Уже видно, что можно что-nj попробовать. Да, оно не идеально и не совсем красиво, но хоть как-то. Я пытаюсь сейчас собрать различные варианты, которые можно применить с помощью T-SQL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2018, 10:57 |
|
||
|
Валидация метаданных excel файла с помощью T-SQL
|
|||
|---|---|---|---|
|
#18+
otets1988Santa89, Клиент генерирует excel файл в своей программе и далее выгржает на фтп. В эту часть никто не будет лезть. Хорошая программа. Не дает гарантий что в поле даты не будет записан Int и парочку полей может не выгрузить... Вобщем вы пишите костыль, ну или программу для программы.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2018, 11:31 |
|
||
|
Валидация метаданных excel файла с помощью T-SQL
|
|||
|---|---|---|---|
|
#18+
Руслан ДамировичSSIS пробовали использовать? Там все есть из коробки - и заберет с FTP, и метаданные валидирует, и в случае ошибки в лог запишет, и даже email с sms отправить сможет - даже думать не нужно. Там плохая коробка. С подвохами. И слишком большая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2018, 14:01 |
|
||
|
Валидация метаданных excel файла с помощью T-SQL
|
|||
|---|---|---|---|
|
#18+
otets1988, Может не стоит из пушки по воробьям мочить, а попробовать напрячься и разобраться в инструменте, который предлагает чел. в данной статье: https://www.codeproject.com/Articles/1128472/CSV-File-Parser ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2018, 14:11 |
|
||
|
Валидация метаданных excel файла с помощью T-SQL
|
|||
|---|---|---|---|
|
#18+
otets1988, если для Excel файлов *. xlsx надо что то сложнее чем просто залить/отлить то используйте компоненту EPPLus по ссылке есть и солюшн с кучей примеров вот ещё пошаговые примеры напишите .NET программку и вызывайте EPPLus из неё ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2018, 14:45 |
|
||
|
Валидация метаданных excel файла с помощью T-SQL
|
|||
|---|---|---|---|
|
#18+
otets1988Владислав Колосов, С точки зрения архитектурного подхода в целом скорее всего вы правы, но есть одно большое НО. У меня очень мало времени на эту задачу, но что еще хуже - знаний C# и VBA у меня еще меньше... Поэтому на сегодня только один вариант - T-SQL. Пусть он будет не такой железобетонный, как на C# или VBA, но будет на T-SQL. Хотелось бы более элегантное решение нежели мое. я тоже знаю вообщем только SQL прилично в ETL часто используется подход 1 грузится все в ландинговую таблицу - в данном случае строки (varchar() ) 2 из нее уже в 2-ю пытаясь преобразовать к нужными типам int , date и т.д возожмные ошибки TRY_CAST, TRY_CONVERT надеясь что версия 2012 зы хотя если одбс драйвер будет екесл. поля воспринимать не как строки - не прокатит - тогда возможно нужен маленький vba для экспорта в промежуточный csv ps Прочитла внимательней - если структура файлов нарушена нафиг - максимум записать что это файл кривой и все - разбираться что там не так автоматически это пусть в никда ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2018, 15:14 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39671460&tid=1689440]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
43ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 249ms |
| total: | 376ms |

| 0 / 0 |
