【问题标题】:SSIS - Using a foreach loop container to update records after transferSSIS - 使用 foreach 循环容器在传输后更新记录
【发布时间】:2011-01-06 11:43:39
【问题描述】:

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

ServerA 位于内部,ServerB 位于数据中心。 从 ServerA 到 ServerB 存在 VPN 连接,反之亦然。 出于安全原因,我们希望移除 ServerB“查看”ServerA 的能力

当前的 SQL 选择语句是这样的:

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 循环容器可以做到这一点,但我在任何地方都找不到...... 有人能指出我正确的方向吗

【问题讨论】:

  • 您可能过于复杂了。您不能让服务器 A 创建一个非常窄的表,该表仅包含名为 [ServerAPK] 之类的主键,将其传输到服务器 B,然后在您的 WHERE 子句中使用该列表吗?
  • 为什么不直接使用 MERGE 命令呢?它旨在同步两个表。您无需担心设置位、循环或其他任何事情。 bit.ly/7UU0p
  • 是的,应该使用上述不同的方法
  • 因为一台服务器是SQL 2008,一台是2000——仅支持>2008

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


【解决方案1】:

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

分步过程:

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

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

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

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

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

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

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

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

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

  10. 包的示例执行如屏幕截图 #13 所示。如您所见,丢失的7,778 rows 已从Server B 转移到Server A。参考截图#14查看包执行后的表记录数。

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

希望对您有所帮助。

脚本

.

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:

屏幕截图 #2:

截图#3:

屏幕截图 #4:

屏幕截图 #5:

屏幕截图 #6:

截图#7:

截图#8:

屏幕截图 #9:

屏幕截图 #10:

屏幕截图 #11:

屏幕截图 #12:

屏幕截图 #13:

屏幕截图 #14:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    相关资源
    最近更新 更多