仅当给定查询不存在记录时,如何继续执行下一个任务?

Vin*_*ith 3 sql t-sql ssis sql-server-2008

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

SELECT      Number
        ,   COUNT(Number) AS DuplicateCheckresult
FROM        [TelephoneNumberManagement].[dbo].[Number]
GROUP BY    Number
HAVING      COUNT(Number) > 1
Run Code Online (Sandbox Code Playgroud)

小智 16

以下使用SSIS 2008 R2and SQL Server 2008 R2backend 创建的示例说明了如何在SSIS包中实现您的需求.

创建一个名为的表,dbo.Phone并将其填充为将返回重复结果的记录.

CREATE TABLE [dbo].[Phone](
    [Number] [int] NOT NULL
) ON [PRIMARY]
GO

INSERT INTO dbo.Phone (Number) VALUES 
    (1234567890),
    (1234567890);
GO
Run Code Online (Sandbox Code Playgroud)

您需要稍微修改您的查询,以便它返回重复的总数而不是重复的行.此查询将只生成一个值(标量值),该值可以是零值或非零值,具体取决于是否找到重复项.这是我们将在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 
Run Code Online (Sandbox Code Playgroud)

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

变量

在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任务常规

输入SQL查询

执行SQL任务结果集

在执行SQL任务之后放置另一个任务.我选择了Foreach Loop Container作为样品.连接任务,如下所示.

控制流选项卡

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

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

编辑

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

优先约束

测试

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

约束

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

表数据

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

执行1

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

TRUNCATE TABLE dbo.Phone;

INSERT INTO dbo.Phone (Number) VALUES 
    (1234567890),
    (0987654321);
Run Code Online (Sandbox Code Playgroud)

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

非重复数据

如果我们执行包,它将进入Foreach循环容器,因为表中没有重复的行 dbo.Phone

执行2

希望有所帮助.

  • 什么时候出现你的SSIS提示和技巧书?:) (4认同)