SSIS: как преобразовать оператор SQL из файла в строковую переменную?

У меня есть несколько операторов SQL, хранящихся в текстовых файлах. Как перенести эти файлы в строковую переменную в SSIS, чтобы можно было использовать один и тот же запрос в нескольких местах?


Ответ на вопросы:

Запросы длинные и сложные, что я бы предпочел редактировать в реальном текстовом редакторе, а не в текстовых полях SSIS. Я также хотел бы, чтобы запросы могли редактироваться людьми, у которых нет доступа к службам SSIS или которые не знают, как их использовать. Наконец, каждый из запросов используется в ряде различных потоков данных. Поправьте меня, если я ошибаюсь, но если я использую один и тот же запрос в нескольких местах, я считаю, что мне нужно либо использовать переменную, либо переписать код для каждого потока данных.


person kubi    schedule 26.10.2009    source источник
comment
Но почему вы хотите получать запросы из файлов, а не напрямую использовать их внутри пакета? И как/где вы используете эти запросы внутри пакета? Пожалуйста, объясните больше о ваших требованиях и на основе этого можно предложить правильный путь.   -  person Faiz    schedule 26.10.2009
comment
Я отредактировал пост, чтобы ответить на ваши вопросы. Спасибо,   -  person kubi    schedule 26.10.2009


Ответы (3)


Вот как я это сделал (после того, как везде искал ответ и не нашел его).

Я начал с пакета, созданного мастером экспорта данных, поэтому мои инструкции относятся к нему. Таким образом настраиваются сопоставления столбцов. Если вы не использовали мастер экспорта для создания пакета, возможно, вам придется добавить столбцы вручную.

  1. Добавьте в пакет строковую переменную с именем SQLFileName.
  2. Добавьте в пакет строковую переменную с именем SQLCommand.
  3. Добавьте задачу сценария в начале потока управления.
  4. Отредактируйте задачу «Сценарий» и перейдите в раздел «Сценарий».
  5. Добавьте SQLFileName в раздел ReadOnlyVariables. Установите его на путь к вашему файлу .sql.
  6. Добавьте SQLCommand в раздел ReadWriteVariables.
  7. Нажмите «Сценарий дизайна».
  8. Вставьте в скрипт ниже. Он просто считывает содержимое файла, указанного SqlFileName, в SQLCommand.
  9. Подтвердите свой выход и подключите задачу сценария к остальной части вашего потока управления.
  10. Перейдите в свой поток данных и выберите исходный запрос. Вам нужно будет отредактировать свойства, используя окно свойств. Если вы используете необычное окно редактирования, вы получите сообщение об ошибке о том, что текст команды не установлен. Это потому, что SQLCommand пуст во время разработки.
  11. Измените AccessMode на команду SQL из переменной.
  12. В разделе SQLVariableName выберите SQLCommand.
  13. Вы увидите, что к исходному запросу добавляется красный крестик. Это потому, что 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
person Tom Winter    schedule 23.11.2009

Я бы не рекомендовал этого делать. Мое предложение - хранимая процедура.

Вот как это сделать: создайте файловое соединение в диспетчере соединений. Откройте свойства подключения к файлу и отредактируйте выражения. Создайте выражение для свойства строки подключения, которое содержит путь к файлу SQL (что-то вроде @[User::SQLFileName], где SQLFileName — ваша переменная).

Настройте задачу выполнения SQL и укажите для нее подключение к файлу, содержащее только что созданное выражение. Если вы измените путь в переменной, это изменит выполняемый SQL (поскольку выражение оценивается во время выполнения). Вы даже можете загрузить эти пути из базы данных и выполнить для каждого из них задачу выполнения SQL. Если вы загружаете/выгружаете данные, используя эти файлы, а не только задачи SQL, вам необходимо следить за столбцами и метаданными.

Крис

person KSimons    schedule 26.10.2009

В качестве альтернативы (и это может быть неприменимо к вам) вы можете создать представление в фактической базе данных, которое можно изменить без доступа к пакету SSIS. Затем другие пользователи могут редактировать SQL, как вы упомянули, и вы даже можете получить некоторую поддержку IntelliSense в придачу.

Я также не сторонник написания SQL в текстовых полях SSIS.

person Josh Smeaton    schedule 26.10.2009
comment
Другой моей мыслью было иметь вид. Лично мне не нравится идея, что пользователи редактируют SQL, который автоматически запускается в БД без надлежащего утверждения и сначала проверяется. Что, если у кого-то есть опечатка, и она не будет обнаружена, пока не будет удалено несколько строк или не будет завершена половина процедуры...? фу! - person KSimons; 26.10.2009