SQL Server ed ALM su database


Il blog di Alessandro Alpi
Archivio Posts
Anno 2018

Anno 2017

Anno 2016

Anno 2015

Anno 2014

Anno 2013

Anno 2012

Anno 2011

Anno 2010

Anno 2009

Anno 2008

Anno 2007

Anno 2006

[SSIS] - Container e condizioni

L'altro giorno mi è arrivata una richiesta realtiva all'utilizzo delle espressioni e dei constraint nel control flow.
Supponendo di avere tre Task, "Task 1", "Task 2" e "Task 3", il SSIS in questione richiedeva quanto segue:

1) "Task 1" deve essere SEMPRE eseguito
2) "Task 2" viene eseguito SOLO SE l'espressione definita nel constraint che lo precede è valutata a true
3) "Task 3" viene eseguito se
              a) "Task 1" ha finito con successo l'elaborazione e se l'espressione è valutata a false
              b) "Task 1" ha finito con successo l'elaborazione e se l'espressione è valutata a true, ma in tal caso "Task 3" DEVE ATTENDERE l'esecuzione completata di "Task 2"

Per descrivere la situazione in altro modo "Task 3", dopo l'esecuzione di "Task 1", deve attendere anche l'esecuzione di "Task 2" solo se l'espressione sul constraint è true. Viceversa viene eseguito successivamente a "Task 1". 
Non sono riuscito a trovare nulla che mi permettesse di usare solamente constraint, operatori logici ed expression. Questo lo lascio a voi e spero che possiate darmi delle dritte .
Diciamo che una prima soluzione che può balzare all'occhio è quella con un outcome di Completion da "Task 2" a "Task 3". 


Prima esecuzione, @Var = true:
Nel caso in cui la variabile sia a true, vengono eseguiti sia "Task 2" che "Task 3", solo dopo la corretta esecuzione di "Task 1". Quindi ok per 1), 2) e 3), punto b):


Seconda esecuzione, @Var = false:
Se però la variabile vale false viene eseguito solo "Task 1", quindi soddisfatto solo 1):



Il problema, come potete notare dalla seconda esecuzione, è che un task che NON viene eseguito NON dà outcome (Completion, Success, Failure). "Task 2" non viene eseguito poichè la variabile dell'espressione vale false.
Di conseguenza l'esecuzione si ferma prima di quanto ci si potrebbe aspettare.

La soluzione funzionante che ho trovato insieme a Lorenzo è la seguente:


In entrambe le esecuzioni abbiamo ciò che era richiesto:

Esecuzione con @Var = true


Esecuzione con @Var = false


Come potete notare il container ci dà quello che ci serve. Certo, qualunque cosa può essere risolta con uno script, ma usando i task/constraint/expression proprietarie di SSIS, sapreste come migliorare il flow per ottenere ciò che serve? Ho postato questa soluzione semplicissima solo per sottolineare quanto a volte ci si accanisca nel cercare una soluzione con operatori e constraint quando utilizzando i container il tutto si risolva a un minuto di lavoro.
Attendo vostre nuove . Per ora mi accontento di questa soluzione .

Stay Tuned!

Categoria: SSIS 2008 tips
giovedì, 25 mar 2010 Ore. 10.52
Statistiche
  • Views Home Page: 599.572
  • Views Posts: 1.065.647
  • Views Gallerie: 637.597
  • n° Posts: 484
  • n° Commenti: 273



















Copyright © 2002-2007 - Blogs 2.0
dotNetHell.it | Home Page Blogs
ASP.NET 2.0 Windows 2003