Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 SSIS динамическая строка соединения.  [new]
IDVT
Member

Откуда:
Сообщений: 320
Всем привет, подскажите пожалуйста по моей задачи:

Мне необходимо загрузить в пять таблиц данные из csv., которые лежат на FTP сервере, в zip'ких архивах с паролем. Каждый архив содержит месячную выгрузку.
Имена архивов одинаковые за исключением префикса даты в конце файла, аналогично и с содержимом.
В SSIS сделал следующее:
1. Очистка таблиц перед загрузкой.
2. Перемещение нужных архивов из FTP в локальную директорию
3. На каждой итерации цикла (по всем архивам), распаковываю архив в временную директорию. Затем мне необходимо в пакете загрузить все данные в пять таблиц, вот тут и застрял.
Мне известен каждый префикс файла (он одинаков в каждом архиве), как можно добиться динамической строки соединения у компонента «Источник "Неструктурированный файл"». Планирую создать свой источник для каждого файла, чтобы уйти от второго цикла по распакованным файлам, т.е. хочу загрузить все файлы в одном потоке задачи.
К примеру такого формата:
На каждой итерации переменная с наименование архива содержит все что мне нужно «C:\Data\Archiv20160101.zip»
Следовательно, в архиве будут 5ть файлов:
Customers20160101.csv, SKU20160101.csv, ….
Я могу выдернуть дату из наименования архива и добавить ее к ConnectionString источнику, но у «Источник "Неструктурированный файл"» нет такого параметра, задается только в лоб через проводник. Подскажите пожалуйста где он там? или это можно решить только через "Компонент скрипт".
22 дек 16, 17:58    [20038050]     Ответить | Цитировать Сообщить модератору
 Re: SSIS динамическая строка соединения.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31816
IDVT
но у «Источник "Неструктурированный файл"» нет такого параметра, задается только в лоб через проводник.
Есть. В свойствах есть Expression, там можно задать для ConnectionString выражение, например, просто переменную.
Перед выполнением, соответственно, нужно заполнить эту переменную путём на файл.
22 дек 16, 23:17    [20039197]     Ответить | Цитировать Сообщить модератору
 Re: SSIS динамическая строка соединения.  [new]
IDVT
Member

Откуда:
Сообщений: 320
Спасибо большое!
23 дек 16, 08:23    [20039798]     Ответить | Цитировать Сообщить модератору
 Re: SSIS динамическая строка соединения.  [new]
IDVT
Member

Откуда:
Сообщений: 320
Коллеги подскажите пожалуйста, в SSIS пакете использую обработчик событий, в случае ошибки на итерации цикла, выполняю задание SQL т.е. простой запрос с параметрами, со всей необходимой информацией. Но переменная "System::ErrorDescription" создает две строки в таблице, как избежать это?
обе строки идентичны, кроме поле хранящего значение этой переменной.

Не хочется создавать отдельную локальную переменную, в которую сливать Description в одну строку перед выполнением команды.
23 дек 16, 15:28    [20042140]     Ответить | Цитировать Сообщить модератору
 Re: SSIS динамическая строка соединения.  [new]
IDVT
Member

Откуда:
Сообщений: 320
Ошибся, исключение то не одно...., на основе одного сыпятся все сотальные =(
23 дек 16, 15:47    [20042271]     Ответить | Цитировать Сообщить модератору
 Re: SSIS динамическая строка соединения.  [new]
IDVT
Member

Откуда:
Сообщений: 320
Коллеги подскажите пожалуйста, какой алгоритм разумнее использовать:
В пакете ССИС необходимо загружать данные из архивированных файлов, при этом грузить только те файлы, которые не были обработаны ранее (т.е. имена архивов не содержаться в таблице БД). Но имена файлов заранее сконфигурировать нет возможности.

1. Получить имена архивов из таблицы, разместить в переменной с типом Object и на каждой итерации цикла проверять наличие наименования архива в массиве.
2. На каждой итерации цикла выполнять проверку с таблицей БД (exists ...)

Мне пока сложно выбрать правильное направление, т.к. с ССИС’ом на Вы. В будущем архивов в папке «источник» будет достаточно много, какой вариант более производителен?
27 дек 16, 09:32    [20051395]     Ответить | Цитировать Сообщить модератору
 Re: SSIS динамическая строка соединения.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31816
IDVT
1. Получить имена архивов из таблицы, разместить в переменной с типом Object и на каждой итерации цикла проверять наличие наименования архива в массиве.
2. На каждой итерации цикла выполнять проверку с таблицей БД (exists ...)

Мне пока сложно выбрать правильное направление, т.к. с ССИС’ом на Вы. В будущем архивов в папке «источник» будет достаточно много, какой вариант более производителен?
Для больших объёмов поиск в списке небыстрый (это же не индексированный список), лучше искать в таблице.

А ещё лучше сделать процедуру, которая сразу вернёт правильный список для обработки, сама всё проверив.
Такую групповую операцию можно запрограммировать более эффективно.
Я проверяю так при загрузке списки из нескольких сотен тысяч файлов, всё мгновенно - классические операции с множествами, которые так обожает SQL.
27 дек 16, 09:48    [20051464]     Ответить | Цитировать Сообщить модератору
 Re: SSIS динамическая строка соединения.  [new]
IDVT
Member

Откуда:
Сообщений: 320
alexeyvg
....
А ещё лучше сделать процедуру, которая сразу вернёт правильный список для обработки, сама всё проверив.
....


Т.е. лучше сделать запрос xp_cmdshell к директории и исключить все что не нужно? а в пакете цикл будет шагать по результату запроса, я правильно Вас понял?
Есть одна проблема - источник FTP сервер, хотя возможно xp_cmdshell может с ним работать.
27 дек 16, 09:56    [20051492]     Ответить | Цитировать Сообщить модератору
 Re: SSIS динамическая строка соединения.  [new]
Ferdipux
Member

Откуда: Москва
Сообщений: 587
IDVT
Коллеги подскажите пожалуйста, какой алгоритм разумнее использовать:
В пакете ССИС необходимо загружать данные из архивированных файлов, при этом грузить только те файлы, которые не были обработаны ранее (т.е. имена архивов не содержаться в таблице БД). Но имена файлов заранее сконфигурировать нет возможности.
...

Кроме чисто процедурного SQL - можно сделать и через SSIS. Я бы пошел по способу - получить в SSIS имена файлов. Как - посмотреть примеры, такой - получение списка в XML. Дальше - можно или загрузить список во временную таблицу и сделать проверку на непересекающиеся элементы (это если элементов предполагается много), но это сложнее и требует разбирательства как SSIS работает с временными таблицами. Или циклом ходить по XML документу и для каждого файла - проверять наличие в таблице, проще, пойдет если файлов мало.
Разницы между походом хранения промежуточной таблицы в Object или XML - особой нет, делайте что вам доступнее.
27 дек 16, 13:12    [20052514]     Ответить | Цитировать Сообщить модератору
 Re: SSIS динамическая строка соединения.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31816
IDVT
Т.е. лучше сделать запрос xp_cmdshell к директории и исключить все что не нужно? а в пакете цикл будет шагать по результату запроса, я правильно Вас понял?
Есть одна проблема - источник FTP сервер, хотя возможно xp_cmdshell может с ним работать.
Ну да, как вариант.

Из xp_cmdshell можно вызывать что угодно, например, cmd файл, или какие то утилиты.

Ferdipux
Кроме чисто процедурного SQL - можно сделать и через SSIS. Я бы пошел по способу - получить в SSIS имена файлов. Как - посмотреть примеры, такой - получение списка в XML. Дальше - можно или загрузить список во временную таблицу и сделать проверку на непересекающиеся элементы (это если элементов предполагается много), но это сложнее и требует разбирательства как SSIS работает с временными таблицами.
Ну, у ТС так и делается.
Вопрос только в том, что если файлов миллион, то работа с такими списками напрямую будет медленной.
Вот вопрос ТС и был - как в SSIS обрабатывать такие списки?

Ещё недостаток - FTP-таск в SSIS очень ограниченный, практически невозможный для использования. По настройкам, скорости, работе со списками, поддержке SSH и SFTP, и т.д.
27 дек 16, 14:18    [20052882]     Ответить | Цитировать Сообщить модератору
 Re: SSIS динамическая строка соединения.  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5114
я бы сделал скриптаском
на шарпе сделать пересечение "списков" не проблема
при этом вся обработка в памяти нет переходов между пайпом и БД
27 дек 16, 14:28    [20052921]     Ответить | Цитировать Сообщить модератору
 Re: SSIS динамическая строка соединения.  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 34966
Блог
Я бы изменил алгоритм - после загрузки перекладывал бы файлы в 2 папки: успешно и неудачно загруженные. Доп-проверки зависят от того, по каким алгоритмам приходят данные (допускаю или нет повторный приход файлов, допускается ли частичное дублирование содержимого файлов и т.д.)
28 дек 16, 00:25    [20054902]     Ответить | Цитировать Сообщить модератору
 Re: SSIS динамическая строка соединения.  [new]
IDVT
Member

Откуда:
Сообщений: 320
Критик
Я бы изменил алгоритм - после загрузки перекладывал бы файлы в 2 папки: успешно и неудачно загруженные. Доп-проверки зависят от того, по каким алгоритмам приходят данные (допускаю или нет повторный приход файлов, допускается ли частичное дублирование содержимого файлов и т.д.)
Полностью согласен с Вами, но на текущий момент не предоставляет прав владелец FTP сервера (только чтение).
28 дек 16, 16:23    [20057366]     Ответить | Цитировать Сообщить модератору
 Re: SSIS динамическая строка соединения.  [new]
IDVT
Member

Откуда:
Сообщений: 320
Подскажите пожалуйста по еще одному вопросу:

На определенном этапе потока управления есть цикл, в нем содержится поток данных, в котором достаточно много источников OLEDB (мне как раз нужна параллельная обработка нескольких таблиц) но, все эти источники подключены к одному менеджеру, сервера удаленные и присутствуют задержки между итерациями цикла. Не связано ли это с тем что они используют один и тот же менеджер соединения, или он создает на момент обработки свои отдельно не зависимые 'сессии'. Проверить что там на удаленном сервере нет возможности.

Порекомендуйте пожалуйста не так давно изданную книгу по SSIS, но прочитанную.
28 дек 16, 16:39    [20057429]     Ответить | Цитировать Сообщить модератору
 Re: SSIS динамическая строка соединения.  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5114
IDVT
есть цикл, в нем содержится поток данных ... сервера удаленные и присутствуют задержки между итерациями цикла
как правило задержки в циклах ssis связаны не с внутренностями (при прочих равных), а со служебными телодвижениями цикла перед и после итерации.
если есть возможность замените цикл по серверам на параллельный запуск вашего датафлоу сразу по всем серверам (с учётом количества ваших cpu).
если такой возможности нет и вы реально упёрлись в производительность нужно думать как другими способами избавиться от ssis цикла.
28 дек 16, 17:50    [20057731]     Ответить | Цитировать Сообщить модератору
 Re: SSIS динамическая строка соединения.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31816
IDVT
Не связано ли это с тем что они используют один и тот же менеджер соединения, или он создает на момент обработки свои отдельно не зависимые 'сессии'.
По моему да, создаёт отдельные сессии.
28 дек 16, 17:58    [20057779]     Ответить | Цитировать Сообщить модератору
 Re: SSIS динамическая строка соединения.  [new]
IDVT
Member

Откуда:
Сообщений: 320
Дедушка
IDVT
есть цикл, в нем содержится поток данных ... сервера удаленные и присутствуют задержки между итерациями цикла
как правило задержки в циклах ssis связаны не с внутренностями (при прочих равных), а со служебными телодвижениями цикла перед и после итерации.
если есть возможность замените цикл по серверам на параллельный запуск вашего датафлоу сразу по всем серверам (с учётом количества ваших cpu).
если такой возможности нет и вы реально упёрлись в производительность нужно думать как другими способами избавиться от ssis цикла.

В цикле 14 итераций (14 серверов) для замены цикла, придется создать 14 ветвей, но тогда в случае появления нового сервере (структуры БД как правило идентичны) так же придется вносить корректировки в пакет. Возможно ли через сервер брокер выполнять несколько задач к серверам параллельно и получать некое результирующие сообщение (типо OK или ERROR) для продолжения ETL процессов в одном пакете.
29 дек 16, 08:41    [20058817]     Ответить | Цитировать Сообщить модератору
 Re: SSIS динамическая строка соединения.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31816
IDVT
Дедушка
пропущено...
как правило задержки в циклах ssis связаны не с внутренностями (при прочих равных), а со служебными телодвижениями цикла перед и после итерации.
если есть возможность замените цикл по серверам на параллельный запуск вашего датафлоу сразу по всем серверам (с учётом количества ваших cpu).
если такой возможности нет и вы реально упёрлись в производительность нужно думать как другими способами избавиться от ssis цикла.

В цикле 14 итераций (14 серверов) для замены цикла, придется создать 14 ветвей, но тогда в случае появления нового сервере (структуры БД как правило идентичны) так же придется вносить корректировки в пакет. Возможно ли через сервер брокер выполнять несколько задач к серверам параллельно и получать некое результирующие сообщение (типо OK или ERROR) для продолжения ETL процессов в одном пакете.
Вот, к сожалению, МС не удосужился сделать простую вещь - цикл с параллельным выполнением :-(

Можно как то сделать его самому, в извращённой форме.
Через сервер брокер - это, по моему, особо извращённая форма...
В SSIS есть таск запуска пакета - можно было бы сделать пакет импорта для одного источника, и потом вызвать его параллельно несколько раз из обющего пакета, но, к сожалению там нельзя задавать параметры запуска.
Можно запускать эти пакеты из скрипт-таска.
Можно создавать и запускать джобы.
Но это всё, конечно, не сильно удобно для программирования и сопровождения...
29 дек 16, 09:19    [20058892]     Ответить | Цитировать Сообщить модератору
 Re: SSIS динамическая строка соединения.  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
alexeyvg
В SSIS есть таск запуска пакета - можно было бы сделать пакет импорта для одного источника, и потом вызвать его параллельно несколько раз из обющего пакета, но, к сожалению там нельзя задавать параметры запуска.
Как это нельзя? Всегда же было можно параметры передавать.
29 дек 16, 23:07    [20062322]     Ответить | Цитировать Сообщить модератору
 Re: SSIS динамическая строка соединения.  [new]
IDVT
Member

Откуда:
Сообщений: 320
Mind,

Параметры передать можно, а вот как получить результат его выполнения, пока не нашел...
30 дек 16, 09:06    [20062832]     Ответить | Цитировать Сообщить модератору
 Re: SSIS динамическая строка соединения.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31816
Mind
alexeyvg
В SSIS есть таск запуска пакета - можно было бы сделать пакет импорта для одного источника, и потом вызвать его параллельно несколько раз из обющего пакета, но, к сожалению там нельзя задавать параметры запуска.
Как это нельзя? Всегда же было можно параметры передавать.
Что то я не нашёл... (2008R2)
Видимо, недоизучил в своё время :-(
30 дек 16, 09:28    [20062902]     Ответить | Цитировать Сообщить модератору
 Re: SSIS динамическая строка соединения.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8485
alexeyvg,

в проекте есть ветка Project.params.
Эти параметры, в том числе, можно редактировать в опубликованном пакете на сервере.
30 дек 16, 10:54    [20063201]     Ответить | Цитировать Сообщить модератору
 Re: SSIS динамическая строка соединения.  [new]
Ferdipux
Member

Откуда: Москва
Сообщений: 587
alexeyvg
...Что то я не нашёл... (2008R2)
Видимо, недоизучил в своё время :-(


В 2008 оно было гемморойно - в дочернем пакете нужно было определить конфигурацию и в значениях параметра - указать название переменной родительского пакета. В 2012+ сильно проще - параметр пакета определяется отдельно, и передается при вызове в рамках проекта.
30 дек 16, 12:04    [20063555]     Ответить | Цитировать Сообщить модератору
 Re: SSIS динамическая строка соединения.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31816
Ferdipux
В 2008 оно было гемморойно - в дочернем пакете нужно было определить конфигурацию и в значениях параметра - указать название переменной родительского пакета.
Вот я так и не представляю, как это можно сделать.
С учётом того, что нужно разным экземплярам пакетов передавать разные значения (иначе становится неочевидным вообще сам смысл вызова пакета из другого пакета).
Статически ещё можно (сделав в родительском пакете много переменных с одним именем), но как динамически?
Разве что каждый пакет размещать в контейнере, а перед вызовом вставить некий таск, который установит значение этой переменной?
А уж динамически запускать несколько экземпляров пакета вообще невозможно (ну, если не вернуться к тупому запуску через xp_cmdshell, или в Script Task)
Владислав Колосов
в проекте есть ветка Project.params.
Нету такого.
31 дек 16, 13:29    [20066353]     Ответить | Цитировать Сообщить модератору
 Re: SSIS динамическая строка соединения.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31816
Ferdipux
В 2012+ сильно проще - параметр пакета определяется отдельно, и передается при вызове в рамках проекта.
Ну да, может, в новых версиях стало лучше, надо посмотреть...
31 дек 16, 13:30    [20066355]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить