gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:44:08 26 4
gpt4 key购买 nike

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

最佳答案

一种选择是结合使用优先约束和执行 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

  • Variables

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

    关于包裹的 Control Flow选项卡,从工具箱中拖放执行 SQL 任务。

    配置执行SQL任务的General页面如下图:
  • 给一个合适的名字,比如 Check pre-execution
  • 将结果集更改为 Single row因为查询返回一个标量值
  • 设置与 OLE DB 数据源的连接,在本例中为 Practice
  • 将 SQLSourceType 设置为 Variable因为我们将使用存储在变量
  • 中的查询
  • 将 SourceVariable 设置为 User::SQLFetchCount
  • 点击Result Set页面左侧部分

  • Execute SQL Task - General

    配置执行 SQL 任务的结果集页面如下图:
  • 单击添加按钮添加一个新变量,该变量将存储查询返回的计数值
  • 将结果名称更改为 0表示查询返回的第一列值
  • 将变量名称设置为 User::Processed
  • 点击OK

  • Execute SQL Task - Result Set

    关于包裹的 Control Flow选项卡,从工具箱中拖放“发送邮件任务”和“数据流任务”。控制流选项卡应如下所示:

    Control Flow tab

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

    Right-click constraint 1

    在优先约束编辑器上,执行以下步骤:
  • 将评估操作设置为 Expression
  • 将表达式设置为 @[User::Processed] == 0 .这意味着仅当变量 Processed 设置为零时才采用此路径。
  • 点击确定

  • Equal to zero

    右键单击连接执行 SQL 任务和数据流任务的绿色箭头。单击 Edit... 在 Precedence Constraint Editor 上,执行以下步骤:
  • 将评估操作设置为 Expression
  • 将表达式设置为 @[User::Processed] != 0 .这意味着仅当变量 Processed 未设置为零时才采用此路径。
  • 点击确定

  • Not equal to zero

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

    Control Flow final

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

    Data Flow Task logic

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

    Send Mail Task logic

    希望有帮助。

    关于sql-server - 如何根据查询返回的记录数控制 SSIS 包流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12958244/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com