2011-09-02 50 views

回答

16

下面的例子使用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包,创建名为数据类型的Int32DuplicatesCount变量。

Variable

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

Connection Manager

在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分配给结果名称。然后点击确定。

Execute SQL Task General

Enter SQL Query

Execute SQL Task Result Set

将执行SQL任务后,另一项任务。我选择了Foreach Loop Container作为示例。如下所示连接任务。现在

Control Flow tab

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

右键单击并选择Edit...

Edit

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

Precedence Constraint

Test

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

Constraint

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

Table data

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

Execution 1

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

TRUNCATE TABLE dbo.Phone; 

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

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

Non-duplicate data

如果我们执行这个包,它会因为有表dbo.Phone

Execution 2

希望帮助没有重复的行继续Foreach循环容器。

+4

当你的SSIS提示和技巧书出来了吗? :) – cairnz

0

你需要做的就是与@@ROWCOUNT工作,但它是如何做的,你要看你的数据流。看看这个讨论,指出如何用一个或两个数据流来完成。

Using Row Count In SSIS

相关问题