SqlStatementSource表达式与可变源类型

时间:2019-03-26 20:39:10

标签: sql-server variables ssis expression execute-sql-task

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

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

第一条路

  1. 声明变量

enter image description here

  1. 配置如下所示的执行SQL任务

enter image description here

第二种方式

  1. 声明变量

enter image description here

  1. 配置如下所示的执行SQL任务

    enter image description here

enter image description here

enter image description here

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

1 个答案:

答案 0 :(得分:3)

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

  1. 如果开发人员决定将整个SQL Command存储在变量中,则可以使用第一种方法。
  2. 如果SQL Command是基于其他变量构建的,则可以使用第二个参数,例如动态传递表名或由于 Execute SQL Task不支持参数化查询而传递参数

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

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

@[User::strQuery]

官方文档

基于Execute SQL Task official documentation:

可变选项(第一种方法)

  

将源设置为定义Transact-SQL语句的变量。选择此值将显示动态选项SourceVariable。

表达用例(第二种方法)

  

在使用OLE DB连接管理器时,不能使用参数化的子查询,因为Execute SQL Task无法通过OLE DB提供程序派生参数信息。但是,您可以使用表达式将参数值连接到查询字符串中,并设置任务的SqlStatementSource属性


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

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

  

我们可以在变量中有一个动态值,然后直接在我们的SQL语句中设置它。

两个方法都将得到相同的结果,但是如果您需要在不同的任务中使用SQL语句,则应使用变量并使用EvaluateAsExpression选项,以避免多次编写Expression (Harder to稍后再编辑软件包)。否则,只需在Task中定义表达式即可,无需声明动态变量。