如何将系统变量值传递给执行SQL任务中的SQL语句?

时间:2012-04-18 20:04:16

标签: variables ssis

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::MachineNameSELECT @@[System::MachineName]会出现错误 'Error Incorrect systax near '::'

我不是试图将参数传递给查询。我已经搜索了一天但却找不到如何做这个简单的事情!

4 个答案:

答案 0 :(得分:16)

这是一种可以做到这一点的方法。以下示例包是使用SSIS 2008 R2创建的,并使用SQL Server 2008 R2作为后端。

  • 在SQLServer数据库中创建名为 dbo.PackageData
  • 的示例表

Table structure

  • 创建一个SSIS包。
  • 在SSIS上,添加一个名为SQLServer的OLE DB连接管理器以连接到您的数据库,比如连接到SQL Server数据库。
  • 在“控制流”标签上,拖放Execute SQL Task
  • 双击“执行SQL”任务以执行“执行SQL任务编辑器”。
  • 在编辑器的General选项卡上,将Connection属性设置为名为SQLServer的连接管理器。
  • 在属性SQLStatement中,输入插入语句 INSERT INTO dbo.PackageData (PackageName) VALUES (?)

General tab

  • 在“参数映射”选项卡上,单击“添加”按钮,选择要使用的“包”变量。相应地更改数据类型。此示例将PackageName插入表中,因此Data Type将为 VARCHAR 。将Parameter名称设置为 0 ,表示参数的索引值。单击“确定”按钮。

Parameter Mapping tab

  • 执行包。
  • 您会注意到表中插入了新记录。我将包名保留为Package。这就是表
  • 的原因

Package data

希望有所帮助。

答案 1 :(得分:1)

我之前从未使用它,但也许您可以在执行SQL任务中查看表达式的使用。

或者只是将整个查询放入一个变量的表达式,并将evaluateAsExpression设置为true。然后使用OLE DB进行插入

答案 2 :(得分:1)

根据我对@ ZERO答案的评论(在此作为答案重复,因此不会被SSIS新人忽视)。

OP的问题几乎是SSIS属性表达式的用例。

要将SSIS变量传递给查询字符串,可以将其连接到SqlStatementSource属性的表达式集中:

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

这并不是说接受的答案不是一个好的模式,因为一般来说,参数化方法比直接查询字符串操作更安全(针对SQL注入)和更快(重新使用)。但对于系统变量(与用户输入的字符串相反),此解决方案应该不受SQL注入的影响,如果重新使用,这将大致与参数化查询一样快或更快(因为机器名称不是'改变)。

答案 3 :(得分:0)

与@ user756519的答案一起,根据您的连接字符串,您的变量名称和SQLStatementSource更改

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