3

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

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

第一种方式

  1. 声明一个变量

在此处输入图像描述

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

在此处输入图像描述

第二种方式

  1. 声明一个变量

在此处输入图像描述

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

    在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

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

4

1 回答 1

3

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

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

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

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

@[User::strQuery]

官方文档

基于Execute SQL Task 官方文档:

可变选项(第一种方法)

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

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

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


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

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

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

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


最近我发表了一篇关于这个主题的详细文章,你可以在下面的链接中查看它:

于 2019-03-26T20:46:29.620 回答