Динамическое копирование данных каждой таблицы с сервера A на сервер B с использованием служб SSIS - PullRequest
0 голосов
/ 22 февраля 2019

Моя задача состоит в том, чтобы создать рабочий процесс в службах SSIS, в котором он будет копировать данные каждой таблицы с сервера A в те же таблицы на сервере B. На данный момент я остановился на шаге, где я беру данные с сервера A и копирую их.на сервер B. До сих пор я создал рабочий процесс, в котором выполняются следующие шаги:

  1. Чтение данных из файла Excel, в котором находятся имена таблиц для обработки
  2. Вставьте эти строкив целевой базе данных (сервер B) на будущее
  3. В потоке управления, связанном выше, шаги к следующему объекту - выполнить задачу SQL, где внутри я беру все загруженные имена из таблицы в глобальную переменную проекта, называемую «GlobalListOfTables».
  4. Создана другая переменная "localTable", в которой я храню каждую строку переменной / набора "GlobalListOfTables", которую я использую позже в "FOR LOOP".

Здесь у меня естьостановился и что я хочу сделать, это:

Внутри этого LOOP получите все данные с исходного сервера каждой таблицы, используя созданную переменную "localTable", и после вставки всех этих данных на целевой сервер под тем же именем таблицы, что и в переменной "localTable".

Этот последний пункт 5 делает меня немного запутанным, потому что таблицы будут отличаться друг от друга, поэтому не существует единого шаблона распределения таблиц.

Может кто-нибудь дать мне знать, как мне следует работать в SSIS и какиеконтроль я должен взять из доступного списка, чтобы достичь пункта 5?

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Задача «Перенос базы данных» и «Задача переноса объектов SQL Server»

Если вы хотите скопировать все данные из базы данных в другую, вам следует обратиться к Transfer Database Task и Transfer SQL Server Objects Task:

На основании официальной документации Задача переноса базы данных :

Задача переноса базы данных переносит базу данных SQL Server между двумя экземплярами SQL Server.В отличие от других задач, которые передают объекты SQL Server только путем их копирования, задача «Передача базы данных» может копировать или перемещать базу данных.Эту задачу также можно использовать для копирования базы данных на том же сервере.

Кроме того, на основе Официальная документация Задача переноса объектов SQL Server :

Задача «Передача объектов SQL Server» передает один или несколько типов объектов в базе данных SQL Server между экземплярами SQL Server.Например, задача может копировать таблицы и хранимые процедуры.В зависимости от версии SQL Server, которая используется в качестве источника, доступны различные типы объектов для копирования.Например, только база данных SQL Server содержит схемы и определяемые пользователем агрегаты.

Подробные статьи

Существует множество статей, описывающих, как работать с этими задачами, и все доступные параметры, а такжепример:

0 голосов
/ 22 февраля 2019

Вы можете использовать объекты C # SMO из задачи «Сценарий» для передачи динамического списка таблиц.Цикл служб SSIS не требуется.Переменная объекта SSIS (GlobalListOfTables) должна быть включена в поле ReadOnlyVariables в задаче сценария.Не забудьте добавить ссылки Microsoft.SqlServer.SmoExtended и Microsoft.SqlServer.ConnectionInfo на задачу «Сценарий» в дополнение к перечисленным ниже.

using System.Data;
using Microsoft.SqlServer.Management.Smo;
using System.Collections.Generic;
using System.Data.OleDb;



       string databaseName = "DatabaseName";
       List<string> tableNames = new List<string>();
       DataTable dt = new DataTable();
       OleDbDataAdapter dataAdapter = new OleDbDataAdapter();

        //get table names from SSIS object variable
       dataAdapter.Fill(dt, Dts.Variables["User::SourceServerName"].Value);

        //populate list
        foreach (DataRow dr in dt.Rows)
        {
          tableNames.Add(dr[0].ToString());
        }

        //create source server object
        Server srcServ = new Server(@"SourceServerName");
        srcServ.ConnectionContext.LoginSecure = true;
        srcServ.ConnectionContext.StatementTimeout = 600;
        srcServ.ConnectionContext.Connect();

        //define source database as smo object
        Database sourceDatabase = srcServ.Databases["SourceDatabaseName"];

        Transfer transfer = new Transfer();
        transfer.Database = sourceDatabase;

        //set destination server and database
        transfer.DestinationServer = @"DestinationServerName";
        transfer.DestinationDatabase = databaseName;

        //overwrite objects if they exist
        transfer.DropDestinationObjectsFirst = true;

        transfer.CopyAllObjects = false;
        transfer.CopySchema = true;

        //include data
        transfer.CopyData = true;

        foreach (Table t in sourceDatabase.Tables)
        {   
            //extract table names that were originally in SSIS object variable and avoid system objects
            if (tableNames.Contains(t.Name) && !t.IsSystemObject)
            {
                transfer.ObjectList.Add(t);
            }
        }
        //transfer objects
         transfer.TransferData();
...