Home Page Home Page Tips & Tricks SSIS - Come impostare la proprietà IsSorted

SSIS - Come impostare la proprietà IsSorted


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.

Scenario
Immaginiamo 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 Utenti
Codice SQL n°1
CREATE 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 DettaglioUtenti
Codice SQL n°2
CREATE 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 !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5