我在 VS 2017 和 SQL Server 2016 中使用 SSIS。
我想知道以下设置SQLStatement
值的方法有什么区别Execute SQL Task
:
第一种方式
- 声明一个变量
- 配置执行 SQL 任务,如下所示
第二种方式
- 声明一个变量
在这两种方式中,我都使用变量来赋值SQLStatement
,但在第一种方式中,我直接设置它,而在第二种方式中,我使用表达式。
我在 VS 2017 和 SQL Server 2016 中使用 SSIS。
我想知道以下设置SQLStatement
值的方法有什么区别Execute SQL Task
:
第一种方式
第二种方式
在这两种方式中,我都使用变量来赋值SQLStatement
,但在第一种方式中,我直接设置它,而在第二种方式中,我使用表达式。
如果 SQL 命令是基于其他变量构建的,则可以使用第二个,例如动态传递表名,或者传递参数,因为Execute SQL Task 不支持参数化查询:
"SELECT * FROM [" + @[User::SchemaName] + "].[" + @[User::TableName] + "]"
我记得,在旧的 SSIS 版本中,第一个选项不可用。然后在稍后(我认为是 2012 年)版本中添加它以方便开发人员的工作,以防整个 SQL 命令存储在一个变量中,而不是添加一个变量表达式:
@[User::strQuery]
可变选项(第一种方法)
将源设置为定义 Transact-SQL 语句的变量。选择此值会显示动态选项 SourceVariable。
表达式用例(第二种方法)
使用 OLE DB 连接管理器时,不能使用参数化子查询,因为执行 SQL 任务无法通过 OLE DB 提供程序派生参数信息。但是,您可以使用表达式将参数值连接到查询字符串中并设置任务的 SqlStatementSource 属性。
此更新是对以下评论的回复:
我们可以在我们的变量中有一个动态值并直接在我们的 SQL 语句中设置它。
两种方法都会给出相同的结果,但是如果您需要在不同的任务中使用 SQL 语句,那么您应该使用变量并使用EvaluateAsExpression
选项来避免多次编写表达式(以后更难编辑包)。否则无需声明动态变量,只需在任务中定义表达式即可。
最近我发表了一篇关于这个主题的详细文章,你可以在下面的链接中查看它: