Нет лучшего подхода, у каждого свой сценарий использования
- Первый подход можно использовать, если разработчик решил сохранить всю команду SQL внутри переменной.
Второе можно использовать, если команда SQL построена на основе других переменных, таких как динамическая передача имени таблицы или передача параметра, поскольку Задача «Выполнение SQL» не поддерживает параметризованные запросы :
"SELECT * FROM [" + @[User::SchemaName] + "].[" + @[User::TableName] + "]"
Как я помню, в старых версиях служб SSIS первый вариант был недоступен. Затем она добавляется позже (я думаю, в 2012 году) версии для облегчения работы разработчика в случае, если вся команда SQL хранится внутри переменной, а не добавляется выражение одной переменной:
@[User::strQuery]
Официальная документация
На основе Официальная документация по выполнению задачи SQL:
Вариант переменной (1-й подход)
Установите в качестве источника переменную, которая определяет инструкцию Transact-SQL. При выборе этого значения отображается динамический параметр SourceVariable.
Случай использования выражения (2-й подход)
Когда вы используете диспетчер соединений OLE DB, вы не можете использовать параметризованные подзапросы, поскольку задача «Выполнение SQL» не может получить информацию о параметрах через поставщика OLE DB. Тем не менее, вы можете использовать выражение для объединения значений параметров в строку запроса и для установки свойства SqlStatementSource задачи .
Переменная оценивается как выражение против выражения задачи
Это обновление является ответом на следующий комментарий:
Мы можем иметь динамическое значение в нашей переменной и устанавливать его непосредственно в нашем выражении SQL.
Оба метода дают один и тот же результат, но если вам нужно использовать оператор SQL в разных задачах, вам следует использовать переменную и использовать опцию EvaluateAsExpression
, чтобы избежать многократного написания выражения (Труднее редактировать пакет позже) . В противном случае нет необходимости объявлять динамическую переменную, просто определите выражение внутри Задачи.