以下使用 SSIS 2008 R2 和 SQL 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
希望对您有所帮助。