代码之家  ›  专栏  ›  技术社区  ›  Bruno

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

  •  0
  • Bruno  · 技术社区  · 8 年前

    到目前为止,我已经得到了我的SSIS包,在那里我可以迭代工厂数据库并读取其中一个表。我目前正在将该表的结果存储到一个变量中。我通过在For Each循环容器的连接管理器中使用一个表达式来完成迭代部分,该表达式将初始目录设置为循环中的当前数据库名称。

    enter image description here

    我尝试创建另一个执行SQL任务,该任务将获取新苹果的结果并将其复制到主数据库。然而,从我目前在谷歌上搜索到的情况来看,似乎并没有一个简单的方法来实现这一点。

    select * from Apple where exported = 0; ).

    任何关于如何从变量中读取结果集或使OLE DB源与上述连接管理器一起工作的建议都将非常有用。

    我也愿意采用其他方法来实现这一点。正如我所说,我是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 回复  |  直到 8 年前
        1
  •  1
  •   KeithL    8 年前

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

    1. 变量类型为“Object”
    2. 在表达式中,将新的变量类型字符串设置为“Select*from”+[dbname]+“[schema].[tablename],其中导出=0” 4a。注意,dbname是#2中的可枚举集

    这样至少可以加载您的数据。

        2
  •  1
  •   KeithL    8 年前

    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
    
        3
  •  0
  •   Bruno    8 年前

    我决定接受我的两种方法的混合。SSIS包与遍历每个电厂数据库的逻辑基本相同。在循环中,我现在有几个执行SQL任务来从各个表导入数据。导入苹果任务的逻辑如下所示:

    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; 
    

    这使我没有冗余SQL,因为每个任务将在每个工厂数据库中执行一次。

    推荐文章