SqlStatementSource 表达式与变量源类型

SqlStatementSource expression vs Variable Source Type

我在 VS 2017 和 SQL Server 2016 中使用 SSIS。

我想知道以下方法在 Execute SQL Task 中设置 SQLStatement 的值有什么区别:

第一种方式

  1. 声明一个变量

  1. 配置执行SQL如下任务

第二种方式

  1. 声明一个变量

  1. 配置执行SQL如下任务

在这两种方式中,我都使用变量来分配SQLStatement的值,但在第一种方式中,我直接设置它,而在第二种方式中,我使用表达式。

没有更好的方法,每个都有自己的用例

  1. 如果开发人员决定将整个 SQL 命令存储在变量中,则可以使用第一种方法。
  2. 如果SQL命令是基于其他变量构建的,例如动态传递table名称,或者传递参数,因为执行SQL任务不支持参数化查询:

    "SELECT * FROM [" + @[User::SchemaName] + "].[" + @[User::TableName] + "]"
    

我记得,在旧的 SSIS 版本中,第一个选项不可用。然后在以后添加 (我认为在 2012 年) 版本以方便开发人员工作,以防整个 SQL 命令存储在一个变量中而不是添加一个变量表达式:

@[User::strQuery]

官方文档

基于Execute SQL Task official documentation:

可变选项(第一种方法)

Set the source to a variable that defines the Transact-SQL statement. Selecting this value displays the dynamic option, SourceVariable.

表达式用例(第二种方法)

When you use an OLE DB connection manager, you cannot use parameterized subqueries because the Execute SQL Task cannot derive parameter information through the OLE DB provider. However, you can use an expression to concatenate the parameter values into the query string and to set the SqlStatementSource property of the task.


变量评估为表达式与任务表达式

此次更新是对以下评论的回复:

We can have a dynamic value in our variable and set it directly in our SQL Statement.

两种方法都会给出相同的结果,但是如果您需要在不同的任务中使用 SQL 语句,那么您应该使用变量并使用 EvaluateAsExpression 选项以避免多次编写表达式(以后更难编辑包)。否则无需声明动态变量,只需在任务中定义表达式即可。


最近我发表了一篇关于这个话题的详细文章,你可以在下面link:

查看