Package SSIS

mercoledì 30 luglio 2008 - 14.17

squilibrium Profilo | Junior Member

Ciao a tutti

Vorrei chiedere un consiglio su come progettare un ETL con SSIS di sql server 2005.

L'ETL si deve scorrere una directory. All'interno ci sono 2 tipi di file che contengono dati da caricare su 2 tabelle.

TIPO FILE A : i record del file devono andare nella tabella GOLD
TIPO FILE B : i record del file devono andare nella tabella CLIENTI

Fin qui sembrerebbe una cosa standard.
La difficoltà nasce nel caso B : se alcuni record presentano delle caratteristiche particolari devono andare nella tabella GOLD anzichè nella tabella CLIENTI

I record destinati alla tabella GOLD devono subire delle trasformazioni standard (sia se provengono da A che da B)
e delle trasformazioni differenti a seconda della provenienza (se provengono quindi da file di tipo A o da file di tipo B).

La strada + immediata è di creare 2 dataflow:
DATAFLOW A che elabora i file di TIPO A e inserisce dentro tabella GOLD
DATAFLOW B che elabora i file di TIPO B e inserisce a seconda dei casi dentro GOLD o dentro CLIENTI.

Così facendo mi ritroverei però replicate le trasformazioni che devo fare sempre e comunque per i record che vanno inseriti dentro la tabella GOLD.

Mi piacerebbe trovare una soluzione più modulare ma non sono ancora molto pratico di SSIS e quindi non riesco ad organizzarla.

Ho letto che è possibile creare dei custom source, task e destination e credo che questa potrebbe essere una strada valida.

Qualcuno sa darmi qualche indicazione?

Grazie

alx_81 Profilo | Guru

>Ciao a tutti
Ciao!

>Fin qui sembrerebbe una cosa standard.
>La difficoltà nasce nel caso B : se alcuni record presentano
>delle caratteristiche particolari devono andare nella tabella
>GOLD anzichè nella tabella CLIENTI
>I record destinati alla tabella GOLD devono subire delle trasformazioni
>standard (sia se provengono da A che da B)
>e delle trasformazioni differenti a seconda della provenienza
>(se provengono quindi da file di tipo A o da file di tipo B).
>
>La strada + immediata è di creare 2 dataflow:
>DATAFLOW A che elabora i file di TIPO A e inserisce dentro tabella GOLD
>DATAFLOW B che elabora i file di TIPO B e inserisce a seconda dei casi dentro GOLD o dentro CLIENTI.
>
>Così facendo mi ritroverei però replicate le trasformazioni che
>devo fare sempre e comunque per i record che vanno inseriti dentro
>la tabella GOLD.
>
>Mi piacerebbe trovare una soluzione più modulare ma non sono
>ancora molto pratico di SSIS e quindi non riesco ad organizzarla.
>
>Ho letto che è possibile creare dei custom source, task e destination
>e credo che questa potrebbe essere una strada valida.
>
>Qualcuno sa darmi qualche indicazione?
Sicuramente scriversi un custom task ti permette elasticità, anche se si introducono altre problematiche come la manutenibilità del codice scritto per quanto riguarda la compatibilità con le nuove versioni, ecc.. Oppure il fatto di dover ricompilare un task per ogni modifica..
Duplicare, diventa scomodo per la manutenibilità del SSIS stesso.
Io vedo altre due possibilità:

1 - Scrivere una stored procedure che gestisca la parte di trasformazione, in modo che sia per il file A che per i record del B che devono andare in A richiami la stessa sp.

2 - Scrivere prima i record di B che vanno in A in append al file A (formattati identici) e poi fare due dataflow diretti, senza casistiche (se non quella che salta i record del file B che devono andare in A).

La prima, ti obbliga a scrivere una Stored Procedure non troppo semplice, ma ti permette di avere un solo punto centrale.
La seconda ti aumenta un po' lo stress io, andando a ridondare su file le informazioni.


--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

squilibrium Profilo | Junior Member

Innanzitutto grazie per la risposta

Penso che la prima soluzione (la stored) sia la più immediata.
A me piacerebbe però creare un modulo indipendente che accetta una struttura dati (anche in memoria) e fa le sue elaborazioni. Con una stored se cambia un campo nel flusso dei dati devo modificare la chiamata alla stessa in tutti i punti in cui la utilizzo.
Con la seconda soluzione da un lato risolverei questo problema ma in realtà non posso modificare i file che leggo e crearne di nuovi mi sembra eccessivo.

Esiste un modo per impostare come data flow source una struttura in memoria? Ho visto che come data flow destination esiste il "Recordset Destination" ma non trovo una struttura equivalente fra i source



alx_81 Profilo | Guru

>Innanzitutto grazie per la risposta
figurati

>Esiste un modo per impostare come data flow source una struttura
>in memoria? Ho visto che come data flow destination esiste il
>"Recordset Destination" ma non trovo una struttura equivalente
>fra i source
puoi usare un datareader, puoi usare uno script component come source e crearti un oggetto tuo (un buffer).
Lo script a mio avviso potrebbe darti una buona elasticità..

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5