SSIS - 使用foreach循环容器在传输后更新记录

时间:2011-01-06 11:43:39

标签: sql-server sql-server-2008 ssis

我们正在使用SSIS将3个表的内容从ServerA传输到ServerB

ServerA位于内部,ServerB位于数据中心。 从ServerA到ServerB有VPN连接,反之亦然。 出于安全原因,我们希望删除ServerB“看到”ServerA

的能力

当前的SQL select语句如下所示:

SELECT * FROM ServerB.OrderTable WHERE NOT IN ServerA.OrderTable

(我很欣赏语法已关闭)

然后将这些记录插入ServerA.OrderTable(表格相同)

这非常有效 - 只传输不在ServerA中的记录

但是,这要求ServerB了解ServerA 我建议做的是在每个表上放置一个“Transferred”位列,并遍历每条记录,将Transferred设置为true。

这样,上面提到的SQL语句可以改为:

SELECT * FROM ServerB.OrderTable WHERE Transferred = 0

我的问题是,如何做到这一点? 我被告知foreach循环容器可以做到这一点,但我找不到任何地方...... 有人能指出我正确的方向

1 个答案:

答案 0 :(得分:3)

可能你现在已经找到了问题的答案。这个答案是为了帮助那些可能偶然发现这个问题的人。这是一个可用的选项,可用于使用SSIS解决数据传输。我假设您仍然可以从SSIS包创建指向服务器A和B的连接字符串。如果这个假设是错误的,请告诉我,这样我就可以删除这个答案。在此示例中,我使用SQL Server 2008 R2作为后端。由于我没有两台服务器,因此我在不同的Schemas ServerA ServerB 中创建了两个相同的表。

分步流程:

  1. 在SSIS的Connection manager部分中,创建两个OLE DB连接,即 ServerA ServerB 。此示例指向同一服务器,但在您的方案中,连接将需要指向您的两个不同的服务器。请参阅屏幕截图# 1

  2. 创建两个架构ServerAServerB。在两个模式中创建表dbo.ItemInfo。这些表的创建脚本在脚本部分下给出。同样,这些对象仅用于此示例。

  3. 我已使用一些示例数据填充了这两个表。表格ServerA.ItemInfo包含2,222 rows,表格ServerB.ItemInfo包含10,000 rows。根据问题,缺少的 7,778 行应从ServerB转移到ServerA。请参阅屏幕截图# 2

  4. 在SSIS包的控制流选项卡上,放置数据流任务,如屏幕截图# 3 所示。

  5. 双击数据流任务以导航到数据流选项卡并配置数据流任务,如下所述。 服务器B OLE DB Source; 在服务器A中查找记录Lookup transformation task服务器A OLE DB Destination

  6. 配置OLE DB Source 服务器B ,如屏幕截图# 4 和# 5 所示。

    < / LI>
  7. 配置Lookup transformation task 在服务器A中查找记录,如屏幕截图# 6 - # 8 所示。在此示例中,ItemId是唯一键。因此,这是用于搜索两个表之间的缺失记录的列。由于我们只需要服务器A 中不存在的行,因此我们需要选择Redirect rows to no match output选项。

  8. 在数据流任务上放置OLE DB Destination。将查找转换任务与OLE DB目标连接时,系统将提示您Input Output Selection对话框。从对话框中选择Lookup No Match Output,如屏幕截图# 9 所示。配置OLE DB Destination 服务器A ,如屏幕截图# 10 和# 11 所示。

  9. 配置数据流任务后,它应如屏幕截图# 12 所示。

  10. 包的示例执行显示在屏幕截图# 13 中。您可以注意到,丢失的7,778 rows已从Server B转移到Server A。请参阅屏幕截图# 14 以查看程序包执行后的表记录计数。

  11. 由于要求只是插入缺失的记录,因此使用了这种方法。如果您想更新现有记录并删除不再有效的记录,请参阅我在此 link. SQL Integration Services to load tab delimited file? 中提供的示例。该链接中的示例显示了如何传输平面文件到SQL但它更新现有记录并删除无效记录。此外,该示例经过精心调整以处理大量行。

  12. 希望有所帮助。

    <强>脚本

    CREATE SCHEMA [ServerA] AUTHORIZATION [dbo]
    GO
    
    CREATE SCHEMA [ServerB] AUTHORIZATION [dbo]
    GO
    
    CREATE TABLE [ServerA].[ItemInfo](
        [Id] [int] IDENTITY(1,1) NOT NULL,
        [ItemId] [varchar](255) NOT NULL,
        [ItemName] [varchar](255) NOT NULL,
        [ItemType] [varchar](255) NOT NULL,
        CONSTRAINT [PK_ItemInfo] PRIMARY KEY CLUSTERED ([Id] ASC),
        CONSTRAINT [UK_ItemInfo_ItemId] UNIQUE NONCLUSTERED ([ItemId] ASC)
    ) ON [PRIMARY]
    GO
    
    CREATE TABLE [ServerB].[ItemInfo](
        [Id] [int] IDENTITY(1,1) NOT NULL,
        [ItemId] [varchar](255) NOT NULL,
        [ItemName] [varchar](255) NOT NULL,
        [ItemType] [varchar](255) NOT NULL,
        CONSTRAINT [PK_ItemInfo] PRIMARY KEY CLUSTERED ([Id] ASC),
        CONSTRAINT [UK_ItemInfo_ItemId] UNIQUE NONCLUSTERED ([ItemId] ASC)
    ) ON [PRIMARY]
    GO
    

    屏幕截图#1:

    1

    屏幕截图#2:

    2

    屏幕截图#3:

    3

    屏幕截图#4:

    4

    屏幕截图#5:

    5

    屏幕截图#6:

    6

    屏幕截图#7:

    7

    屏幕截图#8:

    8

    屏幕截图#9:

    9

    屏幕截图#10:

    10

    屏幕截图#11:

    11

    屏幕截图#12:

    12

    屏幕截图#13:

    13

    屏幕截图#14:

    14