我是SSIS的新手,我需要编写一个将数据从事务数据库移动到主数据库的包。我们每个工厂都有一个事务数据库,所有这些都是相同的。我需要遍历每个数据库中的每个表,并将尚未标记为导出的所有数据复制到master数据库中的相应表中。将记录成功复制到主数据库后,应将它们标记为在事务数据库中导出。
到目前为止,我已经将我的SSIS包装到了我可以遍历工厂数据库并从其中一个表中读取的地方。我目前正在将该表中的结果存储到变量中。我使用For Each Loop Container的Connection Manager中的表达式完成了迭代部分,该表达式将Initial Catalog设置为循环中的当前数据库名称。
但是,我不确定如何继续。这是我的包裹当前状态的图片:
我尝试创建另一个执行SQL任务,该任务从Get New Apples获取结果并将它们复制到master数据库。但是,从我到目前为止用谷歌搜索来看,似乎并不是一个简单的方法来实现这一目标。
我尝试过的另一种方法是使用与For Each循环容器相同的连接管理器创建OLE DB源。当我这样做时,我得到一个错误,说Apple表不是有效对象(我的查询是select * from Apple where exported = 0;
)。
关于如何从变量读取结果集或让OLE DB Source与上述Connection Manager一起使用的任何建议都会非常有用。
我也愿意采用其他方法来实现这一目标。就像我说的那样,我是SSIS的新手,我仍然在摸索着它。
最初我试图将其作为一个存储过程,但它开始变得难以管理和丑陋:
SELECT *
INTO #tempapple
FROM (SELECT *
FROM [Plant1].[dbo].[Apple]
WHERE exported = 0
UNION
SELECT *
FROM [Plant2].[dbo].[Apple]
WHERE exported = 0) AS x;
INSERT INTO [Master].[dbo].[Apple]
SELECT id,
NAME,
description,
active,
plant
FROM #tempapple
WHERE id NOT IN (SELECT id
FROM [Master].[dbo].[Apple]);
UPDATE [Plant1].[dbo].[Apple]
SET exported = 1
WHERE id IN (SELECT id
FROM #tempapple);
UPDATE [Plant2].[dbo].[Apple]
SET exported = 1
WHERE id IN (SELECT id
FROM #tempapple);
DROP TABLE #tempapple;
答案 0 :(得分:1)
我必须在这里做一些假设:
这应该至少可以加载您的数据。
您可以选择更新源中的isExported列。
答案 1 :(得分:1)
我是直接写的,所以你可能需要稍微修改一下。
declare @dbname as varchar(100) -- dbname
declare @SQL varchar(max)
declare db_cursor cursor for
[ this is where you insert your code for getting DBnames]
OPEN db_cursor
fetch next from db_cursor into @dbname
while @@fetch_status = 0
BEGIN
set @SQL = "Select * into #temptable from " + @dbname + ".[dbo].[Apple] where exported = 0
INSERT INTO [Master].[dbo].[Apple]
SELECT id,
NAME,
description,
active,
plant
FROM #tempapple
-- no where clause needed
UPDATE " + @dbname + ".[dbo].[Apple]
SET exported = 1
from " + @dbname + ".[dbo].[Apple] a
join #temptable tt on a.id=tt.id
DROP TABLE #tempapple; "
exec(@sql);
fetch next from db_cursor into @dbname
END
close db_cursor
deallocate db_cursor
答案 2 :(得分:0)
我决定采用我的两种方法。 SSIS包与迭代每个工厂数据库的逻辑大致相同。在循环中,我现在有几个执行SQL任务来从各个表导入数据。导入apple任务的逻辑如下所示:
SELECT *
INTO #tempapple
FROM (SELECT *
FROM apple
WHERE exported = 0);
INSERT INTO [Master].[dbo].[apple]
SELECT id,
NAME,
description,
active,
plant
FROM #tempapple
WHERE id NOT IN (SELECT id
FROM [Master].[dbo].[apple]);
UPDATE apple
SET exported = 1
WHERE id IN (SELECT id
FROM #tempapple);
DROP TABLE #tempapple;
这允许我没有reduntant SQL,因为每个工作数据库将执行一次任务。