Най-добрата практика на ssis за зареждане на N таблици от източник към целеви сървър

Трябва да заредя N (около 50) таблици от изходна база данни в целева. Всяка таблица е различна от другите (толкова различни метаданни); Мислех, че мога да използвам родителски pkg, за да извикам дъщерните, където всеки ще има проста структура като DFT за картографиране на таблиците за импортиране. Идеята 1 дъщерен pkg -> 1 таблица -> 1 dft + конфигурационна таблица, използвана от родителя за извикване на N pkg, би била хубав дизайн, предполагам, че по този начин мога да достигна модулност и мога да добавя/премахвам таблиците лесно. Лошото приложение би било да поставите всичко в един монолитен пакет с bouch od DFT... blah Имате ли някаква идея/пример за справяне с такъв сценарий? Марио


person rio    schedule 26.11.2013    source източник


Отговори (3)


Станах фен на използването на biml за решаване на подобни проблеми.

  1. Изтеглете и инсталирайте Помощник за BIDS
  2. Добавете нов biml файл към съществуващ SSIS проект
  3. Деактивирайте автоматичната корекция на Visual Studio за XML файлове. Вижте Преодоляване на проблеми с копирането и поставянето на BimlScript във Visual Studio
  4. Поставете този код в този файл Bimlscript.biml
  5. Коригирайте низовете за свързване на източника и местоназначението (редове 8 и 9), за да сочат към правилните сървъри, както и да промените типа на доставчика, ако SQLNCLI11.1 не е правилен за вашата версия на SQL Server
  6. Щракнете с десния бутон върху файла biml и изберете „Генериране на SSIS пакети“

Ако приемем, че всичко е подредено, ще получите 29 пакета, които имат една задача за поток от данни в тях, изтегляйки от източника до местоназначението (на базата на SSIS променлива).

<#@ template language="C#" hostspecific="true" #>
<#@ import namespace="System.Data" #>
<#@ import namespace="System.Data.SqlClient" #>
<#@ import namespace="System.IO" #>
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<!--
<#
    string connectionStringSource = @"Server=localhost\dev2012;Initial Catalog=AdventureWorksDW2012;Integrated Security=SSPI;Provider=SQLNCLI11.1";
    string connectionStringDestination = @"Server=localhost\dev2012;Initial Catalog=AdventureWorksDW2012_DEST;Integrated Security=SSPI;Provider=SQLNCLI11.1";

    string SrcTableQuery =     @"
SELECT
    SCHEMA_NAME(t.schema_id) AS schemaName
,   T.name AS tableName
FROM
    sys.tables AS T
WHERE
    T.is_ms_shipped = 0
    AND T.name <> 'sysdiagrams';
";

    DataTable dt = null;
    dt = ExternalDataAccess.GetDataTable(connectionStringSource, SrcTableQuery);
#>    
-->
    <Connections>
        <OleDbConnection
            Name="SRC"
            CreateInProject="false"
            ConnectionString="<#=connectionStringSource#>"
            RetainSameConnection="false">
        </OleDbConnection>
        <OleDbConnection
            Name="DST"
            CreateInProject="false"
            ConnectionString="<#=connectionStringDestination#>"
            RetainSameConnection="false">
        </OleDbConnection>
    </Connections>

    <Packages>
        <# foreach (DataRow dr in dt.Rows) { #>
            <Package ConstraintMode="Linear"
                Name="<#=dr[1].ToString()#>"

            >
            <Variables>
                <Variable Name="SchemaName" DataType="String"><#=dr[0].ToString()#></Variable>
                <Variable Name="TableName" DataType="String"><#=dr[1].ToString()#></Variable>
                <Variable Name="QualifiedTableSchema"
                          DataType="String"
                          EvaluateAsExpression="true">"[" +  @[User::SchemaName] + "].[" +  @[User::TableName] + "]"</Variable>
            </Variables>
            <Tasks>
                <Dataflow
                    Name="DFT"
                >
                    <Transformations>
                        <OleDbSource
                            Name="OLE_SRC <#=dr[0].ToString()#>_<#=dr[1].ToString()#>"
                            ConnectionName="SRC"
                        >
                            <TableFromVariableInput VariableName="User.QualifiedTableSchema"/>
                        </OleDbSource>
                        <OleDbDestination
                            Name="OLE_DST <#=dr[0].ToString()#>_<#=dr[1].ToString()#>"
                            ConnectionName="DST"
                            KeepIdentity="true"
                            TableLock="true"
                            UseFastLoadIfAvailable="true"
                            KeepNulls="true"
                            >
                            <TableFromVariableOutput VariableName="User.QualifiedTableSchema" />                        
                        </OleDbDestination>
                    </Transformations>
                </Dataflow>

            </Tasks>
            </Package>
        <# } #>
    </Packages>
</Biml>

На този етап просто трябва да разберете как искате да координирате изпълнението на пакетите.

person billinkc    schedule 26.11.2013
comment
възможно ли е да се генерира BIML скрипт с изключение на колоните с идентификатор? Въпреки че и източникът, и целта имат идентификатори, имам нужда моята цел да попълни собствената си колона за самоличност - person Daryl Wenman-Bateson; 05.12.2013
comment
@DarylWenman-Bateson промени KeepIdentity="true" на KeepIdentity="false" - person billinkc; 05.12.2013
comment
Поздрави противник (@TheOptimusPrimus) Това беше гласувано като неполезно. Бихте ли ми помогнали да разбера какво не е полезно, за да мога да подобря отговора? - person billinkc; 17.12.2013
comment
@billinkc Ще работи ли това за всеки източник на данни oledb или е специфично за SQL Server? - person JSacksteder; 24.07.2014
comment
@JSacksteder Добър въпрос. Предполагам, че доставчиците трябва да внедрят някакъв стандартен интерфейс за тези неща, така че въз основа на това трябва да работи. Ако не хвърля друг въпрос със спецификата на използваните доставчици (източник и дестинация) - person billinkc; 24.07.2014
comment
@billnkc, стандартният начин да направите това е част от OLEDB, но това не е изложено в SSIS. Ако трябва да изпратите заявка, за да получите данните, това е специфично за доставчика. Epic Bummer. - person JSacksteder; 29.07.2014
comment
това работи ли за източника на Salesforce? Искам да копирам схемата на salesforce на SQL сървър с помощта на BIML. - person Satishakumar Awati; 05.07.2018
comment
@SatishakumarAwati Нямам достъп до SF, така че не мога да коментирам - person billinkc; 05.07.2018

Можете да използвате Execute SQL Task в SSIS, за да копирате с помощта на това или да изпълните директно от SQL Agent. Това предполага, че схемата вече съществува в целевата база данни.

DECLARE @tblname as varchar(50);
DECLARE @tblschema as varchar(50);
DECLARE @srcdb as varchar(12);
DECLARE @destdb as varchar(12);
DECLARE @tablesql as nvarchar(255);

SET @srcdb = 'MYSRCDB';
SET @destdb = 'MYDESTDB';

DECLARE tbl_cursor CURSOR FOR
SELECT table_schema, table_name FROM information_schema.tables where table_type = 'BASE TABLE'

OPEN tbl_cursor

FETCH NEXT FROM tbl_cursor INTO @tblschema, @tblname
WHILE @@FETCH_STATUS = 0
BEGIN

SET @tablesql = N'SELECT * into '+@destdb+'.'+@tblschema+'.'+@tblname+' FROM '+@srcdb+'.'+@tblschema+'.'+@tblname;
EXECUTE sp_executesql @tablesql

FETCH NEXT FROM tbl_cursor INTO @tblschema, @tblname
END

CLOSE tbl_cursor
DEALLOCATE tbl_cursor
person Steve Salowitz    schedule 26.11.2013

има много фактори, които оказват влияние върху това какъв сценарий да изберете.

Но като цяло:

За малки таблици с относително малко редове можете да поставите множество източници/дестинации в един поток от данни

Ако имате сложен ETL за източник/дестинация, по-добре е да ги поставите на отделни задачи за поток от данни за яснота

Ако трябва да дефинирате последователността на изпълнение, трябва да използвате множество задачи за поток от данни, тъй като не можете да контролирате реда на изпълнение за множество източници/дестинации в единични задачи за поток от данни.

Всеки път, когато имате нужда от различно ниво на изолация на транзакции или поведение, трябва да ги поставите в отделни потоци от данни.

Всеки път, когато не сте сигурни за въздействието на ETL върху изходната система, поставете ги в отделни потоци от данни, тъй като това ще ви позволи по-лесно да оптимизирате реда на изпълнение в бъдеще.

Ако имате големи таблици, ги поставете в отделни задачи за поток от данни, тъй като това ще позволи да се оптимизират размерите на буферите за различни таблици и да се оптимизира ETL процеса по каквато и да е причина

Така че от горното, ако имате сравнително малки таблици и директно съпоставяне на източник/дестинация, тогава няма проблем да имате повече източник/дестинации в един поток от данни.

В други случаи е по-добре или необходимо да ги поставите в отделни потоци от данни, тъй като това ще ви позволи да оптимизирате ETL процеса от трите гледни точки:

Въздействие на натоварването върху системите източник

Въздействие на натоварването върху целевите системи

Използване на машината, на която се изпълнява ETL процесът (консумация на процесора, консумация на памет и цялостен изход).

person SmartestVEGA    schedule 19.08.2015