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任务之后放置另一个任务.我选择了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循环容器.

让我们从表dbo.Phone中删除行,并使用以下脚本使用非重复行填充它们.
TRUNCATE TABLE dbo.Phone;
INSERT INTO dbo.Phone (Number) VALUES
(1234567890),
(0987654321);
Run Code Online (Sandbox Code Playgroud)
现在,表中的数据如下所示.

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

希望有所帮助.