【问题标题】:How to control SSIS package flow based on record count returned by a query?如何根据查询返回的记录数控制 SSIS 包流?
【发布时间】:2012-10-18 15:30:05
【问题描述】:

我正在尝试在执行我的包之前先检查是否有任何新记录需要处理。我在 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 来更新源表。
任何帮助将不胜感激。

【问题讨论】:

  • 检查conditional splitstage

标签: sql-server ssis sql-server-2008-r2


【解决方案1】:

一种选择是将优先约束与执行 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 后执行包时,包将执行发送邮件任务。

希望对您有所帮助。

【讨论】:

  • 我认为这是我见过的最详尽的帖子 +1
  • 是的,这正是我过去做过类似事情的方式。截图做得很好。
  • 这帮助很大。我遇到了一个问题,我可能可以使用你的代码,但是因为我不完全理解它,所以我很难实现它。 stackoverflow.com/questions/22864166/…。请帮帮我。
  • 很好的答案!非常有用!
  • 这是我在 SO 上看到的最好的答案之一。非常感谢!
【解决方案2】:

你的 SSIS 设计应该是

来源:

Select count(processed) Cnt from dbo.AR_Sale where processed = 0

Conditional Split 阶段[在数据流转换下]:

output1: Order 1, Name - EmailCnt, Condition - Cnt = 0
output2: Order 2, Name - ProcessRows, Condition - Cnt > 0

输出链接:

EmailCnt Link: Send email

ProcessRowsLink: DataFlowTask

【讨论】:

    猜你喜欢
    • 2011-05-28
    • 2021-12-10
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多