如何根据查询返回的记录计数控制SSIS包流?

use*_*753 15 sql-server ssis sql-server-2008-r2

我正在尝试首先检查在执行我的包之前是否有任何新记录要处理.我在SQL Server 2008 R2表中有一个名为"已处理"的字段,如果处理则值为1,否则为0.

我想查询它:

select count(processed) from dbo.AR_Sale where processed = 0
Run Code Online (Sandbox Code Playgroud)

如果结果为0,我想发送一封电子邮件,说明记录不存在.如果大于零,我想继续执行包.我是SSIS的新手,似乎无法找出使用什么工具.

我的包有一个数据流项,其中有一个OLE DB连接到数据库.连接使用查询来返回记录.不幸的是,即使没有要处理的记录,查询也会成功完成(应该如此).这是查询:

Select * from dbo.AR_Sale where processed = 0
Run Code Online (Sandbox Code Playgroud)

我将这些记录复制到数据仓库,然后通过将处理过的字段从0更改为1来运行另一个查询以更新源表.
任何帮助都将非常感谢.

小智 65

一种选择是结合执行SQL任务使用优先约束来实现此功能.以下是如何实现此目的的示例SSIS 2008 R2.

我根据问题中提供的信息创建了一个简单的表.

创建表脚本:

CREATE TABLE dbo.AR_Sale(
    Id int NOT NULL IDENTITY PRIMARY KEY,
    Item varchar(30) NOT NULL,
    Price numeric(10, 2) NOT NULL,
    Processed bit NOT NULL
) 
GO
Run Code Online (Sandbox Code Playgroud)

然后使用一些示例数据填充新表.您可以看到其中一行已将Processed标志设置为零.

填充表脚本:

INSERT INTO dbo.AR_Sale (Item, Price, Processed) VALUES
    ('Item 1', 23.84, 1),
    ('Item 2', 72.19, 0),
    ('Item 3', 45.73, 1);
Run Code Online (Sandbox Code Playgroud)

在SSIS包上,创建以下两个变量.

  • Processed 数据类型 Int32
  • SQLFetchCountString值设置为的数据类型SELECT COUNT(Id) ProcessedCount FROM dbo.AR_Sale WHERE Processed = 0

变量

在SSIS项目上,创建一个OLE DB数据源,指向您选择的数据库.将数据源添加到包的连接管理器.在这个例子中,我使用了命名数据源为Practice.

在包的Control Flow选项卡上,从工具箱中拖放"执行SQL任务".

配置执行SQL任务的" 常规"页面,如下所示:

  • 说出一个合适的名字Check pre-execution
  • ResultSet更改为,Single row因为查询返回标量值
  • 在此示例中,将Connection连接到OLE DB数据源Practice
  • SQLSourceType设置为,Variable因为我们将使用存储在变量中的查询
  • SourceVariable设置为User::SQLFetchCount
  • 点击Result Set左侧部分的页面

执行SQL任务 - 常规

配置执行SQL任务的结果集页面,如下所示:

  • 单击"添加"按钮以添加一个新变量,该变量将存储查询返回的计数值
  • 结果名称更改为0以指示查询返回的第一个列值
  • 变量名称设置为User::Processed
  • 点击 OK

执行SQL任务 - 结果集

在包的Control Flow选项卡上,从工具箱中拖放"发送邮件任务"和"数据流任务"."控制流"选项卡应如下所示:

控制流选项卡

右键单击加入执行SQL任务和发送邮件任务的绿色箭头.单击编辑...绿色箭头称为优先约束.

右键单击约束1

在Precedence Constraint Editor上,执行以下步骤:

  • 评估操作设置为Expression
  • 表达式设置为@[User::Processed] == 0.这意味着仅当变量Processed设置为零时才采用此路径.
  • 单击确定

等于零

右键单击加入执行SQL任务和数据流任务的绿色箭头.单击编辑...在Precedence Constraint Editor上,执行以下步骤:

  • 评估操作设置为Expression
  • 表达式设置为@[User::Processed] != 0.这意味着仅当变量Processed未设置为零时才采用此路径.
  • 单击确定

不等于零

控制流选项卡看起来像这样.您可以配置发送邮件任务以发送电子邮件,并配置数据流任务以根据您的要求更新数据.

控制流程最终

当我使用基于填充表脚本的数据集执行包时,包将执行数据流任务,因为有一行未处理.

数据流任务逻辑

当我使用脚本在表中的所有行上将Processed标志设置为1后执行包时UPDATE dbo.AR_Sale SET Processed = 1,包将执行发送邮件任务.

发送邮件任务逻辑

希望有所帮助.

  • 我认为这是我见过的最精彩的帖子+1 (6认同)

rs.*_*rs. 5

你的SSIS设计应该是

来源:

Select count(processed) Cnt from dbo.AR_Sale where processed = 0
Run Code Online (Sandbox Code Playgroud)

条件分割阶段[数据流转换下]:

output1: Order 1, Name - EmailCnt, Condition - Cnt = 0
output2: Order 2, Name - ProcessRows, Condition - Cnt > 0
Run Code Online (Sandbox Code Playgroud)

输出链接:

EmailCnt Link: Send email

ProcessRowsLink: DataFlowTask
Run Code Online (Sandbox Code Playgroud)