A volte può capitare di dover collegare tra loro più resultset, ad esempio tramite il component
Merge Join . Alcune trasformazioni necessitano di ricevere set di input ORDINATI. Quando questi input sono considerati ordinati?
SSIS riesce a comprenderlo tramite una proprietà:
IsSorted.
ScenarioImmaginiamo di dover mettere in
Join due sorgenti
OLEDB che puntano a server differenti.
Possiamo legare le due source tramite un campo che hanno in comune.
Pensiamo a due tabelle:
Tabella UtentiCREATE TABLE dbo.Utenti
(
IDUtente int NOT NULL
, Nome varchar(30) NOT NULL
, Cognome varchar(30) NOT NULL
, Eta tinyint NOT NULL
, CONSTRAINT PK_Utenti PRIMARY KEY CLUSTERED
(
IDUtente ASC
)
)
Tabella DettaglioUtentiCREATE TABLE dbo.DettaglioUtenti
(
IDUtente int NOT NULL
, Indirizzo varchar(100) NOT NULL
, IDTipoIndirizzo tinyint NOT NULL
, CONSTRAINT PK_DettaglioUtenti PRIMARY KEY CLUSTERED
(
IDUtente ASC
, IDTipoIndirizzo ASC
)
)
In comune hanno il campo
IDUtente, quindi risulterà comodo legare quell’informazione con il task
Merge Join. Proviamo a scrivere un
DataFlow:
Prima sorgente:
Seconda sorgente:
Merge Join:
Il DataFlow appare come segue:
Collegando semplicemente i tre task, il
Merge Join torna un errore, seppure i legami sembrino logicamente corretti. Come mai? Il messaggio è chiaro:
Ok, ma cosa significa? Dove si trova questa
IsSorted?
La risposta alla prima domanda è semplice. Siccome la
Join che andiamo ad effettuare è di tipo merge, i due insiemi devono essere ORDINATI.
La seconda possiamo suddividerla in ulteriori due, ovvero:
Posso usare un task intermedio per ridefinire la IsSorted a True?
Come imposto la proprietà senza l’utilizzo di altri task?Passiamo alle risposte:
In effetti esiste un task che permette di “forzare” a
True la
IsSorted ed è il
Sort Transofrmation.
Con esso è sufficiente indicare quali sono le colonne che ordinano l’insieme. Nel nostro caso, ordiniamo l'
IDUtente. Come possiamo notare, dopo l’aggiunta del task, non si hanno più errori ed il dataflow risulta corretto.
Ma se proprio non volessimo aggiungere ulteriori oggetti, possiamo intervenire direttamente sulle sorgenti, ma siamo “costretti” (non fa male ;-) ) ad accedere all'
Advanced Editor:
Spostiamoci sulla sezione
"Input And Output Properties":
Clickiamo sull'output (non sull'error output) e sulla destra impostiamo la proprietà
IsSorted a
True.
Non finisce qui. Se cambiassimo solo quello senza definire quali colonne sono interessate dall'ordinamento otterremmo un ulteriore errore nel
DataFlow (a dire il vero è un Warning per la sorgente, ma per il merge
Join l'errore rimane).
Torniamo nella sezione
"Input And Output Properties" e questa volta espandiamo l’output, accedendo alle colonne. Selezioniamo quelle che ci interessano e definiamo la
SortKeyPosition (un intero progressivo):
Ad esempio, per ordinare per
IDUtente e
Nome, basta indicare 1 per la
SortKeyPosition di
IDUtente e 2 per la
SortKeyPosition di Nome.
Una volta ripetuta l'operazione per tutte le colonne usate nella
Join, e per ogni sorgente dati che si lega nel merge
Join, il
DataFlow sarà correttamente configurato.
Fine, la scelta della via da seguire spetta a voi !