如何使用SSIS将数据从事务数据库移动到主数据库

时间:2017-08-02 19:18:43

标签: sql-server database ssis

我是SSIS的新手,我需要编写一个将数据从事务数据库移动到主数据库的包。我们每个工厂都有一个事务数据库,所有这些都是相同的。我需要遍历每个数据库中的每个表,并将尚未标记为导出的所有数据复制到master数据库中的相应表中。将记录成功复制到主数据库后,应将它们标记为在事务数据库中导出。

到目前为止,我已经将我的SSIS包装到了我可以遍历工厂数据库并从其中一个表中读取的地方。我目前正在将该表中的结果存储到变量中。我使用For Each Loop Container的Connection Manager中的表达式完成了迭代部分,该表达式将Initial Catalog设置为循环中的当前数据库名称。

但是,我不确定如何继续。这是我的包裹当前状态的图片:

enter image description here

我尝试创建另一个执行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; 

3 个答案:

答案 0 :(得分:1)

我必须在这里做一些假设:

  1. 变量的类型为'Object'
  2. foreach循环位于ADO.Object枚举器上,将db名称设置为变量
  3. 在数据流
  4. 之前插入表达式
  5. 在表达式中设置一个新的变量类型字符串为“Select * from”+ [dbname] +“。[schema]。[tablename] where exported = 0” 4A。请注意,dbname是#2
  6. 中的可枚举集
  7. 在数据流中,将源设置为变量并在#4中使用该变量。
  8. 这应该至少可以加载您的数据。

    您可以选择更新源中的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,因为每个工作数据库将执行一次任务。