我们正在使用 SSIS 将 3 个表的内容从服务器传输到服务器
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 循环容器可以做到这一点,但我在任何地方都找不到......
有人能指出我正确的方向吗
也许您现在已经找到了问题的答案。这个答案是为了帮助其他可能偶然发现这个问题的人。这是一个可能的选项,可用于解决使用 SSIS 的数据传输问题。我假设您仍然可以从 SSIS 包创建指向服务器 A 和 B 的连接字符串。如果这个假设是错误的,请告诉我,以便我删除这个答案。在这个例子中,我使用SQL Server 2008 R2
作为后端。由于我没有两台服务器,因此我在不同的位置创建了两个相同的表Schemas
ServerA and ServerB.
分步过程:
In the Connection manager
SSIS 部分,创建两个 OLE DB 连接,即ServerA and ServerB。此示例指向同一台服务器,但在您的场景中,连接需要指向两个不同的服务器。参考截图#1.
创建两个模式ServerA
and ServerB
。创建表dbo.ItemInfo
在这两个模式中。为这些表创建脚本如下Scripts部分。同样,这些对象仅用于本示例。
我已经用一些示例数据填充了这两个表。桌子ServerA.ItemInfo
包含2,222 rows
和桌子ServerB.ItemInfo
包含10,000 rows
。根据问题,失踪的7,778行应该从ServerB
to ServerA
。参考截图#2.
在 SSIS 包的控制流选项卡上,放置一个数据流任务,如屏幕截图所示 #3.
双击数据流任务以导航到数据流选项卡并按如下所述配置数据流任务。Server B is an OLE DB Source
; 在服务器A中查找记录 is a Lookup transformation task
and Server A is an OLE DB Destination
.
配置OLE DB Source
Server B如截图所示#4 and #5.
配置Lookup transformation task
在服务器A中查找记录如截图所示#6 - #8。在此示例中,ItemId 是唯一键。因此,该列用于搜索两个表之间丢失的记录。因为我们只需要不存在于的行Server A,我们需要选择选项Redirect rows to no match output
.
Place a OLE DB Destination
关于数据流任务。当您将查找转换任务与 OLE DB 目标连接时,系统将提示您Input Output Selection
对话。选择Lookup No Match Output
从屏幕截图所示的对话框中 #9。配置OLE DB Destination
Server A如截图所示#10 and #11.
配置数据流任务后,它应该如屏幕截图所示#12.
包的执行示例如屏幕截图所示#13。正如你所注意到的,失踪的7,778 rows
已转自Server B
to Server A
。参考截图#14查看包执行后的表记录数。
由于要求只是插入缺失的记录,因此使用了这种方法。如果您想更新现有记录并删除不再有效的记录,请参阅我在本节中提供的示例关联。 SQL 集成服务加载制表符分隔文件? https://stackoverflow.com/questions/6061075/sql-integration-services-to-load-tab-delimited-file/6159600#6159600链接中的示例显示了如何将平面文件传输到 SQL,但它会更新现有记录并删除无效记录。此外,该示例经过微调以处理大量行。
希望有帮助。
Scripts
.
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:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)