Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: kubiОтветов: 3

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


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

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

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

sqlvariablesssis

Ответы

Ответ 1 · рейтинг 8 · Tom Winter

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

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

  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

Ответ 2 · рейтинг 4 · KSimons

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

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

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

Крис

Ответ 3 · Josh Smeaton

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы