Как передать значение системной переменной в инструкцию SQL в задаче "выполнение SQL"?

SSIS 2008. Очень простая задача. Я хочу получить системную переменную и использовать ее в SQL INSERT. Я хочу получить значение System:MachineName и используйте его в инструкции insert.

используя оператор INSERT INTO MYLOG (COL1) SELECT @[System::MachineName] выдает ошибку Error: ..failed to parse. Must declare the scalar variable "@"

использование операторов SELECT @System::MachineName или SELECT @@[System::MachineName] выдает ошибку 'Error Incorrect systax near '::'

Я не пытаюсь передать параметр в запрос. Я уже искал, но не нашел как сделать это одна простая вещь!

4 ответов


вот один из способов вы можете сделать это. Следующий пример пакета был создан с помощью SSIS 2008 R2 и использует SQL Server 2008 R2 в качестве бэкэнда.

  • создайте пример таблицы в базе данных SQLServer с именем dbo.PackageData

Table structure

  • создайте пакет служб SSIS.
  • в службах SSIS добавьте диспетчер соединений OLE DB с именем SQLServer чтобы подключиться к базе данных, скажите SQL Server база данных.
  • на вкладке поток управления, перетащите Execute SQL Task
  • дважды щелкните по задаче "выполнение SQL", чтобы вызвать редактор задач "выполнение SQL".
  • на General вкладка редактора, установите Connection свойство диспетчера соединений с именем SQLServer.
  • в собственность SQLStatement, введите инструкцию insert INSERT INTO dbo.PackageData (PackageName) VALUES (?)

General tab

  • на вкладке сопоставление параметров щелкните Кнопка Добавить, выберите переменную пакета, которую вы хотите использовать. Измените тип данных. Этот пример собирается вставить имя пакета в таблицу, поэтому Data Type будет VARCHAR. Установите Parameter название 0, который указывает значение индекса параметра. Нажмите кнопку ОК.

Parameter Mapping tab

  • выполнить пакет.
  • вы увидите новую запись в таблицу. Я сохранил имя пакета как Package. Вот почему стол

Package data

надеюсь, это поможет.


Я никогда не использую его раньше, но, возможно, вы можете проверить использование выражения в выполнении задачи SQL для этого.

или просто поместите весь запрос в выражение переменной с evaluateAsExpression, установленным в true. Затем используйте OLE DB, чтобы вставить


в моем комментарии к ответу @ZERO (повторяется здесь как ответ, поэтому его не упускают новички SSIS).

вопрос OP в значительной степени является вариантом использования для выражений свойств SSIS.

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

"INSERT INTO MYLOG (COL1) SELECT " + @[System::MachineName]

Это не означает, что принятый ответ не является хорошим шаблоном, как в целом, параметризованный подход безопаснее (против SQL-инъекции) и быстрее (при повторном использовании), чем прямое манипулирование строками запроса. Но для системной переменной (в отличие от введенной пользователем строки) это решение должно быть безопасным от SQL-инъекции, и это будет примерно так же быстро или быстрее, чем параметризованный запрос, если он будет повторно использован (поскольку имя машины не меняется).


вместе с ответом @user756519, в зависимости от строки подключения, имена переменных и Sqlstatementsource изменяется

https://docs.microsoft.com/en-us/sql/integration-services/control-flow/execute-sql-task