下面的例子使用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包,创建名为数据类型的Int32的DuplicatesCount
变量。
在SSIS包,创建一个OLE DB连接管理器连接到SQL Server数据库。我已将它命名为SQLServer。
在SSIS,包的控制流选项卡,放置一个执行SQL任务,并将其配置在所述屏幕截图中所示的下方。该任务应接受单个行值并将其分配给新创建的变量。将ResultSet
设置为单行。将连接设置为SQLServer
,将SQL语句设置为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 Loop Container作为示例。如下所示连接任务。现在
,要求是,如果没有重复的,这意味着如果在执行SQL任务查询的输出值是零,那么该方案应着手Foreach循环容器。否则,包不应该继续Foreach循环容器。为了实现这一点,我们需要向优先约束(任务之间的绿色箭头)添加一个表达式。在优先约束
右键单击并选择Edit...
在优先约束编辑器,选择从评估操作下拉Expression
。将表达式设置为@[User::DuplicatesCount] == 0
以检查变量DuplicatesCount
是否包含值零。值为零意味着dbo.Phone
表中没有重复项。测试表达式以验证语法是否正确。单击确定关闭验证消息。单击确定关闭优先约束。
现在,控制流程应该是这样的。优先约束将用fx表示,表示存在约束/表达。
让我们来看看在表dbo.Phone
行。如您所见,值1234567890
存在两次。这意味着有重复的行并且Foreach循环容器不应该执行。
让我们执行包。您可以注意到执行SQL任务已成功执行,但未进入Foreach循环容器。这是因为变量DuplicatesCount包含值1,并且我们写了一个条件来检查该值是否为0以继续进行Foreach循环容器。
让我们从表中dbo.Phone删除行,并使用下面的脚本不重复的行填充它。
TRUNCATE TABLE dbo.Phone;
INSERT INTO dbo.Phone (Number) VALUES
(1234567890),
(0987654321);
现在,表格中的数据如下所示。
如果我们执行这个包,它会因为有表dbo.Phone
希望帮助没有重复的行继续Foreach循环容器。
当你的SSIS提示和技巧书出来了吗? :) – cairnz