我正在尝试首先检查在执行我的包之前是否有任何新记录需要处理。我在SQL Server 2008 R2表中有一个名为“已处理”的字段,如果处理则值为1,否则为0。
我想查询它:
select count(processed) from dbo.AR_Sale where processed = 0
如果结果为0,我想发送一封电子邮件,说明记录不存在。如果大于零,我想继续执行包。我是SSIS的新手,似乎无法找出使用什么工具。
我的包中有一个数据流项,其中包含一个OLE DB连接到数据库。连接使用查询来返回记录。不幸的是,即使没有要处理的记录,查询也会成功完成(应该如此)。这是查询:
Select * from dbo.AR_Sale where processed = 0
我将这些记录复制到数据仓库,然后运行另一个查询,通过将处理后的字段从0更改为1来更新源表。 任何帮助将不胜感激。
答案 0 :(得分:60)
一种选择是结合执行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
然后使用一些示例数据填充新表。您可以看到其中一行已将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);
在SSIS包上,创建以下两个变量。
Processed
数据类型Int32
SQLFetchCount
的String
,其值设置为SELECT COUNT(Id) ProcessedCount FROM dbo.AR_Sale WHERE Processed = 0
在SSIS项目中,创建一个OLE DB数据源,指向您选择的数据库。将数据源添加到包的连接管理器。在此示例中,我使用了将数据源命名为Practice
。
在包的Control Flow
选项卡上,从工具箱中拖放执行SQL任务。
配置执行SQL任务的常规页面,如下所示:
Check pre-execution
Single row
,因为查询返回标量值Practice
Variable
,因为我们将使用存储在变量中的查询User::SQLFetchCount
Result Set
页面
配置执行SQL任务的结果集页面,如下所示:
0
以指示查询返回的第一列值User::Processed
OK
在包的Control Flow
标签上,从工具箱中拖放“发送邮件任务和数据流任务”。 “控制流”选项卡应如下所示:
右键单击加入执行SQL任务和发送邮件任务的绿色箭头。单击编辑...绿色箭头称为优先约束。
在Precedence Constraint Editor上,执行以下步骤:
Expression
@[User::Processed] == 0
。这意味着仅当变量Processed设置为零时才采用此路径。
右键单击加入执行SQL任务和数据流任务的绿色箭头。单击编辑...在Precedence Constraint Editor上,执行以下步骤:
Expression
@[User::Processed] != 0
。这意味着仅当变量Processed未设置为零时才采用此路径。
控制流标签看起来像这样。您可以配置发送邮件任务以发送电子邮件,配置数据流任务以根据您的要求更新数据。
当我使用基于填充表脚本的数据集执行包时,包将执行数据流任务,因为有一行未处理。
当我使用脚本UPDATE dbo.AR_Sale SET Processed = 1
在表中的所有行上将Processed标志设置为1后执行包时,包将执行发送邮件任务。
希望有所帮助。
答案 1 :(得分:4)
您的SSIS设计应该
Src:
Select count(processed) Cnt from dbo.AR_Sale where processed = 0
条件分割阶段[在数据流转换下]:
output1: Order 1, Name - EmailCnt, Condition - Cnt = 0
output2: Order 2, Name - ProcessRows, Condition - Cnt > 0
输出链接:
EmailCnt Link: Send email
ProcessRowsLink: DataFlowTask