Считать файл в проекте SSIS в переменную - PullRequest
2 голосов
/ 29 мая 2019

Мои проекты служб SSIS, как правило, выполняют запросы, которые требуют изменений при перемещении между средами, например, может измениться схема таблицы или значение в предложении Where.Я всегда либо помещал свой SQL в параметр проекта, который трудно редактировать, поскольку форматирование потеряно, либо просто помещал его непосредственно в задачу / источник данных «Выполнение SQL», а затем вручную редактировал его между миграциями, что также не идеально.

Мне было интересно, если я добавлю свои сценарии SQL в файлы в проекте, можно ли их снова прочитать?Пример, если я поставлю запрос наподобие этого: выберите id, name from% schema% .tablename. Я хотел бы прочитать это в переменную, тогда легко использовать выражение, как я делаю с параметрами проекта, чтобы заменить% schema% на соответствующийзначение.Затем файлы .sql в проекте можно отредактировать без особых усилий или даже протестировать с помощью задачи «Выполнение SQL», которая отключена / удалена до того, как проект перейдет в поток развертывания.Но я не смог найти способ чтения в файле, используя относительный путь в проекте.Кроме того, я даже не уверен, что они развернуты на сервере SSIS.

Спасибо за понимание.

Я добавил текстовый файл query.sql в проект SSIS (SQL 2017) в Visual Studio, но я не нашел способа извлечь содержимоеquery.sql в переменную.

Ответы [ 2 ]

2 голосов
/ 29 мая 2019

Собственный подход к инструменту

Для задачи «Выполнение SQL» есть возможность получить запрос непосредственно из файла.

Установите для SQLSourceType значение File Connection, а затем укажите диспетчер соединений с файлами в разделе FileConnection.

SQLSourceType = File Connection

Имейте в виду, что, хотя это удобно, оно также созрело для тех, кто наращивает свои права. Если бы у меня был доступ к файлу, который ищет пакет служб SSIS, я мог бы добавить drop database, создать нового пользователя и предоставить ему права SA и т. Д. - все, что может сделать учетная запись, запускающая пакет служб SSIS, может использовать злоумышленник. ,

Раскатать свой собственный подход

Если вы непреклонны перед чтением файла, добавьте две переменные в ваш пакет служб SSIS и укажите значения, подобные приведенным ниже

  • User :: QueryPath -> String -> C: \ path \ to \ file.sql
  • User :: QueryActual -> String -> SELECT 1;

Добавить задачу скрипта в пакет. Укажите в качестве переменной ReadOnly User :: QueryPath и укажите в качестве переменной ReadWrite User :: QueryActual

В пределах Main вам понадобится код, подобный следующему

string filePath = this.Dts.Variables["User::QueryPath"].Value.ToString();
this.Dts.Variables["User::QueryActual"].Value = System.IO.File.ReadAllText(filePath);

Суть вопроса System.IO.File.ReadAllText . Обратите внимание, что это не относится к проверке того, существует ли файл, есть ли у вас разрешение на доступ и т. Д. Это просто чтение файла с нуля (и также открытое для тех же проблем с инъекцией, что и вышеописанный метод - только так, как вы сами его поддерживаете). против тонких инженеров в Microsoft)

0 голосов
/ 29 мая 2019

Вы можете создать свой запрос, используя Variable и Parameter.

Например:

Параметр A: dbo

Создайте свою переменную A (строковый тип) как: "Select * FROM server.DB." + ParameterA + ".Table"

Так что если вам нужно изменить схему, просто измените параметр A, и вы получите соответствующий запрос в переменной A.

...