У меня есть несколько операторов SQL, хранящихся в текстовых файлах. Как перенести эти файлы в строковую переменную в SSIS, чтобы можно было использовать один и тот же запрос в нескольких местах?
Ответ на вопросы:
Запросы длинные и сложные, что я бы предпочел редактировать в реальном текстовом редакторе, а не в текстовых полях SSIS. Я также хотел бы, чтобы запросы могли редактироваться людьми, у которых нет доступа к службам SSIS или которые не знают, как их использовать. Наконец, каждый из запросов используется в ряде различных потоков данных. Поправьте меня, если я ошибаюсь, но если я использую один и тот же запрос в нескольких местах, я считаю, что мне нужно либо использовать переменную, либо переписать код для каждого потока данных.
Ответ 1 · рейтинг 8 · Tom Winter
Вот как я это сделал (после того, как везде искал ответ и не нашел его).
Я начал с пакета, созданного мастером экспорта данных, поэтому мои инструкции относятся к нему. Таким образом настраиваются сопоставления столбцов. Если вы не использовали мастер экспорта для создания пакета, возможно, вам придется добавить столбцы вручную.
- Добавьте в пакет строковую переменную с именем SQLFileName.
- Добавьте в пакет строковую переменную с именем SQLCommand.
- Добавьте задачу сценария в начале потока управления.
- Отредактируйте задачу "Сценарий" и перейдите в раздел "Сценарий".
- Добавьте SQLFileName в раздел ReadOnlyVariables. Установите его на путь к вашему файлу .sql.
- Добавьте SQLCommand в раздел ReadWriteVariables.
- Нажмите "Сценарий дизайна".
- Вставьте в скрипт ниже. Он просто считывает содержимое файла, указанного SqlFileName, в SQLCommand.
- Подтвердите свой выход и подключите задачу сценария к остальной части вашего потока управления.
- Перейдите в свой поток данных и выберите исходный запрос. Вам нужно будет отредактировать свойства, используя окно свойств. Если вы используете необычное окно редактирования, вы получите сообщение об ошибке о том, что текст команды не установлен. Это потому, что SQLCommand пуст во время разработки.
- Измените AccessMode на команду SQL из переменной.
- В разделе SQLVariableName выберите SQLCommand.
- Вы увидите, что к исходному запросу добавляется красный крестик. Это потому, что SQLCommand пуст. Чтобы предотвратить красный X, измените ValidateExternalMetaData на False.
Вот об этом. Надеюсь, я запомнил все детали. Сценарий является ключевой частью, так что вы можете получить SQL в переменной, а затем использовать переменную в потоке данных.
Imports System
Imports System.IO
Imports Microsoft.SqlServer.Dts.Runtime
Public Class ScriptMain
Public Sub Main()
Try
Dts.Variables("SQLCommand").Value = System.IO.File.ReadAllText(Dts.Variables("SQLFileName").Value.ToString)
Dts.TaskResult = Dts.Results.Success
Catch oException As System.Exception
Dts.TaskResult = Dts.Results.Failure
End Try
End Sub
End Class
Ответ 2 · рейтинг 4 · KSimons
Я бы не рекомендовал этого делать. Мое предложение - хранимая процедура.
Вот как это сделать: создайте файловое соединение в диспетчере соединений. Откройте свойства подключения к файлу и отредактируйте выражения. Создайте выражение для свойства строки подключения, которое содержит путь к файлу SQL (что-то вроде @[User::SQLFileName], где SQLFileName - ваша переменная).
Настройте задачу выполнения SQL и укажите для нее подключение к файлу, содержащее только что созданное выражение. Если вы измените путь в переменной, это изменит выполняемый SQL (поскольку выражение оценивается во время выполнения). Вы даже можете загрузить эти пути из базы данных и выполнить для каждого из них задачу выполнения SQL. Если вы загружаете/выгружаете данные, используя эти файлы, а не только задачи SQL, вам необходимо следить за столбцами и метаданными.
Крис
Ответ 3 · Josh Smeaton
В качестве альтернативы (и это может быть неприменимо к вам) вы можете создать представление в фактической базе данных, которое можно изменить без доступа к пакету SSIS. Затем другие пользователи могут редактировать SQL, как вы упомянули, и вы даже можете получить некоторую поддержку IntelliSense в придачу.
Я также не сторонник написания SQL в текстовых полях SSIS.