一种选择是将优先约束与执行 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
然后用一些示例数据填充新表。您可以看到其中一行已处理标志设置为零。
填充表格脚本:
INSERT INTO dbo.AR_Sale (Item, Price, Processed) VALUES
('Item 1', 23.84, 1),
('Item 2', 72.19, 0),
('Item 3', 45.73, 1);
在 SSIS 包上,创建以下两个变量。
-
数据类型为
Int32 的Processed
-
SQLFetchCount 的数据类型为 String,值设置为 SELECT COUNT(Id) ProcessedCount FROM dbo.AR_Sale WHERE Processed = 0
在 SSIS 项目中,创建一个指向您选择的数据库的 OLE DB 数据源。将数据源添加到包的连接管理器。在这个例子中,我使用了将数据源命名为Practice。
在包的Control Flow 选项卡上,从工具箱中拖放执行 SQL 任务。
配置Execute SQL Task的General页面如下图:
- 给一个合适的名字,比如
Check pre-execution
- 将ResultSet更改为
Single row,因为查询返回一个标量值
- 将 Connection 设置为 OLE DB 数据源,在本例中为
Practice
- 将SQLSourceType设置为
Variable,因为我们将使用存储在变量中的查询
- 将SourceVariable设置为
User::SQLFetchCount
- 点击左侧
Result Set页面
配置Execute SQL Task的Result Set页面如下图:
- 单击“添加”按钮添加一个新变量,该变量将存储查询返回的计数值
- 将结果名称更改为
0,表示查询返回的第一列值
- 将变量名设置为
User::Processed
- 点击
OK
在包的Control Flow 选项卡上,从工具箱中拖放发送邮件任务和数据流任务。控制流选项卡应如下所示:
右键单击连接执行 SQL 任务和发送邮件任务的绿色箭头。单击 Edit... 绿色箭头称为 Precedence Constraint。
在 Precedence Constraint Editor 上,执行以下步骤:
- 将评估操作设置为
Expression
- 将表达式设置为
@[User::Processed] == 0。这意味着仅当变量 Processed 设置为零时才采用此路径。
- 点击确定
右键单击连接执行 SQL 任务和数据流任务的绿色箭头。点击 Edit... 在 Precedence Constraint Editor 上,执行以下步骤:
- 将评估操作设置为
Expression
- 将表达式设置为
@[User::Processed] != 0。这意味着仅当变量 Processed 未设置为零时才采用此路径。
- 点击确定
控制流选项卡看起来像这样。您可以根据需要配置发送邮件任务发送电子邮件和数据流任务更新数据。
当我根据填充表脚本执行数据设置为的包时,该包将执行数据流任务,因为有一行未处理。
当我使用脚本UPDATE dbo.AR_Sale SET Processed = 1 将表中所有行的已处理标志设置为 1 后执行包时,包将执行发送邮件任务。
希望对您有所帮助。