我们正在使用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循环容器可以做到这一点,但我找不到任何地方...... 有人能指出我正确的方向
答案 0 :(得分:3)
可能你现在已经找到了问题的答案。这个答案是为了帮助那些可能偶然发现这个问题的人。这是一个可用的选项,可用于使用SSIS解决数据传输。我假设您仍然可以从SSIS包创建指向服务器A和B的连接字符串。如果这个假设是错误的,请告诉我,这样我就可以删除这个答案。在此示例中,我使用SQL Server 2008 R2
作为后端。由于我没有两台服务器,因此我在不同的Schemas
ServerA 和 ServerB 中创建了两个相同的表。
分步流程:
在SSIS的Connection manager
部分中,创建两个OLE DB连接,即 ServerA 和 ServerB 。此示例指向同一服务器,但在您的方案中,连接将需要指向您的两个不同的服务器。请参阅屏幕截图# 1 。
创建两个架构ServerA
和ServerB
。在两个模式中创建表dbo.ItemInfo
。这些表的创建脚本在脚本部分下给出。同样,这些对象仅用于此示例。
我已使用一些示例数据填充了这两个表。表格ServerA.ItemInfo
包含2,222 rows
,表格ServerB.ItemInfo
包含10,000 rows
。根据问题,缺少的 7,778 行应从ServerB
转移到ServerA
。请参阅屏幕截图# 2 。
在SSIS包的控制流选项卡上,放置数据流任务,如屏幕截图# 3 所示。
双击数据流任务以导航到数据流选项卡并配置数据流任务,如下所述。 服务器B 是OLE DB Source
; 在服务器A中查找记录是Lookup transformation task
而服务器A 是OLE DB Destination
。
配置OLE DB Source
服务器B ,如屏幕截图# 4 和# 5 所示。
配置Lookup transformation task
在服务器A中查找记录,如屏幕截图# 6 - # 8 所示。在此示例中,ItemId是唯一键。因此,这是用于搜索两个表之间的缺失记录的列。由于我们只需要服务器A 中不存在的行,因此我们需要选择Redirect rows to no match output
选项。
在数据流任务上放置OLE DB Destination
。将查找转换任务与OLE DB目标连接时,系统将提示您Input Output Selection
对话框。从对话框中选择Lookup No Match Output
,如屏幕截图# 9 所示。配置OLE DB Destination
服务器A ,如屏幕截图# 10 和# 11 所示。
配置数据流任务后,它应如屏幕截图# 12 所示。
包的示例执行显示在屏幕截图# 13 中。您可以注意到,丢失的7,778 rows
已从Server B
转移到Server A
。请参阅屏幕截图# 14 以查看程序包执行后的表记录计数。
由于要求只是插入缺失的记录,因此使用了这种方法。如果您想更新现有记录并删除不再有效的记录,请参阅我在此 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: