【问题标题】:How to proceed to the next task only if no records exist for a given query?仅当给定查询不存在记录时,如何继续执行下一个任务?
【发布时间】:2011-09-02 09:24:10
【问题描述】:

我有以下一段 SQL 将检查是否存在任何重复记录。如何检查是否没有返回记录?我在 SSIS 包中使用它。我只希望它在没有记录的情况下继续下一步,否则会出错。

SELECT      Number
        ,   COUNT(Number) AS DuplicateCheckresult
FROM        [TelephoneNumberManagement].[dbo].[Number]
GROUP BY    Number
HAVING      COUNT(Number) > 1

【问题讨论】:

    标签: sql tsql sql-server-2008 ssis


    【解决方案1】:

    以下使用 SSIS 2008 R2SQL Server 2008 R2 后端创建的示例说明了如何在 SSIS 包中实现您的要求。

    创建一个名为 dbo.Phone 的表,并在其中填充几条会返回重复结果的记录。

    CREATE TABLE [dbo].[Phone](
        [Number] [int] NOT NULL
    ) ON [PRIMARY]
    GO
    
    INSERT INTO dbo.Phone (Number) VALUES 
        (1234567890),
        (1234567890);
    GO
    

    您需要稍微修改您的查询,以便它返回重复的总数而不是重复的行。此查询将仅产生一个值(标量值),该值可能是零值或非零值,具体取决于是否找到重复项。这是我们将在 SSIS 包的执行 SQL 任务中使用的查询。

    SELECT COUNT(Number) AS Duplicates
    FROM
    (   
        SELECT      Number
                ,   COUNT(Number) AS NumberCount
        FROM        dbo.Phone
        GROUP BY    Number
        HAVING      COUNT(Number) > 1
    ) T1 
    

    在 SSIS 包上,创建一个名为 DuplicatesCount 的变量,数据类型为 Int32

    在 SSIS 包上,创建一个 OLE DB 连接管理器以连接到 SQL Server 数据库。我将其命名为 SQLServer

    在 SSIS 的 Control Flow 选项卡上,打包,放置一个 Execute SQL Task 并配置它,如下面的屏幕截图所示。该任务应接受单行值并将其分配给新创建的变量。将ResultSet 设置为单行。将 Connection 设置为 SQLServer,将 SQLStatement 设置为 SELECT COUNT(Number) AS Duplicates FROM (SELECT Number, COUNT(Number) AS NumberCount FROM dbo.Phone GROUP BY Number HAVING COUNT(Number) > 1) T1

    在结果集部分,单击添加按钮并将结果名称设置为0。将变量 User::DuplicatesCount 分配给结果名称。然后点击确定。

    在执行 SQL 任务之后放置另一个任务。我选择了 Foreach 循环容器作为示例。如下所示连接任务。

    现在,要求是如果没有重复,这意味着如果执行 SQL 任务中查询的输出值为零,那么包应该继续到 Foreach 循环容器。否则,包不应进入 Foreach 循环容器。为此,我们需要在优先约束中添加一个表达式(任务之间的绿色箭头)。

    右键单击优先约束并选择Edit...

    在优先约束编辑器中,从评估操作下拉列表中选择 Expression。将表达式设置为 @[User::DuplicatesCount] == 0 以检查变量 DuplicatesCount 是否包含值 zero。值 0 表示表 dbo.Phone 中没有重复项。测试表达式以验证语法是否正确。单击“确定”关闭验证消息。单击确定关闭优先约束。

    现在,控制流应该是这样的。优先约束将用 fx 表示,表示存在约束/表达式。

    让我们检查dbo.Phone 表中的行。如您所见,值1234567890 存在两次。这意味着存在重复的行,不应执行 Foreach 循环容器。

    让我们执行这个包。您可以注意到 Execute SQL 任务已成功执行,但它没有进入 Foreach 循环容器。这是因为变量 DuplicatesCount 包含一个值 1,我们编写了一个条件来检查该值是否应该为零以继续执行 Foreach 循环容器。

    让我们从 dbo.Phone 表中删除行,并使用以下脚本填充不重复的行。

    TRUNCATE TABLE dbo.Phone;
    
    INSERT INTO dbo.Phone (Number) VALUES 
        (1234567890),
        (0987654321);
    

    现在,表格中的数据如下所示。

    如果我们执行这个包,它将继续到 Foreach 循环容器,因为表中没有重复的行 dbo.Phone

    希望对您有所帮助。

    【讨论】:

    • 你的 SSIS 技巧和窍门书什么时候出版? :)
    【解决方案2】:

    您需要做的是使用@@ROWCOUNT,但如何操作取决于您的数据流。看看这个讨论,它指出了如何使用一个或两个数据流来做到这一点。

    Using Row Count In SSIS

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-13
      • 2012-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多