<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://community.ugiss.org/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="it"><title type="html">Alessandro Alpi&amp;#39;s blog</title><subtitle type="html">Parliamo di integration services e non solo..</subtitle><id>http://community.ugiss.org/blogs/sux_stellino/atom.aspx</id><link rel="alternate" type="text/html" href="http://community.ugiss.org/blogs/sux_stellino/default.aspx" /><link rel="self" type="application/atom+xml" href="http://community.ugiss.org/blogs/sux_stellino/atom.aspx" /><generator uri="http://communityserver.org" version="3.0.20611.960">Community Server</generator><updated>2007-10-11T01.57.00Z</updated><entry><title>[SSMS] La gestione dei template</title><link rel="alternate" type="text/html" href="http://community.ugiss.org/blogs/sux_stellino/archive/2008/04/06/ssms-la-gestione-dei-template.aspx" /><id>http://community.ugiss.org/blogs/sux_stellino/archive/2008/04/06/ssms-la-gestione-dei-template.aspx</id><published>2008-04-06T15.27.00Z</published><updated>2008-04-06T15.27.00Z</updated><content type="html">&lt;p&gt;SQL Server Management Studio ci offre la possibilità di utilizzare dei
template predefiniti per la creazione e la modifica di oggetti. La
lista dei template, accessibile dal Template Explorer, è veramente
ampia. Eccone un&amp;#39;anteprima:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://blogs.dotnethell.it/filestore/6263_tex.png" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;Come
possiamo vedere vi sono molti modelli disponibili. Si possono
modificare, se ne possono creare di nuovi. Vi è un&amp;#39;ampia libertà di
movimento. In aggiunta abbiamo anche una lista dei template
recentemente utilizzati dalla quale pescare i nostri preferiti.&lt;br /&gt;Ma
oltre alla lista, esiste la possibilità di scriverli &amp;quot;al volo&amp;quot; per
utilizzarli subito, ad esempio, all&amp;#39;interno di uno script SQL.
Prendendo spunto da uno dei tanti template disponibili sul Template
explorer, notiamo il formato dei placeholder:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;lt;nome_parametro, tipo_dati, valore&amp;gt;&lt;br /&gt;&lt;/i&gt;&lt;i&gt;&lt;br /&gt;nome_parametro&lt;/i&gt; rappresenta il nome del parametro nello script.&lt;i&gt;&lt;br /&gt;tipo_dati&lt;/i&gt; è il tipo di dati del parametro.&lt;br /&gt;&lt;i&gt;valore&lt;/i&gt; è il valore che sostituirà ogni occorrenza del parametro nello script.&lt;br /&gt;&lt;br /&gt;Facciamo un semplice esempio. Ipotizziamo di dover creare uno script atto alla creazione di un database. &lt;br /&gt;Vogliamo
che il database sia formato da tre file (un mdf, un ldf ed un ndf) i
cui nomi sono composti dal nome del database seguito da un suffisso, e
da due FILEGROUP, PRIMARY e SECONDARY. Ecco un possible script, che va
bene per ogni database:&lt;br /&gt;&lt;br /&gt;



























































































































&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;CREATE&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:blue;"&gt;DATABASE&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;lt;&lt;/span&gt;NomeDB&lt;span style="color:gray;"&gt;,&lt;/span&gt; stringa&lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;ON&lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;PRIMARY&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:gray;"&gt;(&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:blue;"&gt;NAME&lt;/span&gt; &lt;span style="color:gray;"&gt;=&lt;/span&gt; N&lt;span style="color:red;"&gt;&amp;#39;&amp;lt;NomeDB, stringa, &amp;gt;_data&amp;#39;&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:blue;"&gt;FILENAME&lt;/span&gt; &lt;span style="color:gray;"&gt;=&lt;/span&gt; N&lt;span style="color:red;"&gt;&amp;#39;C:\Databases\&amp;lt;NomeDB,
stringa, &amp;gt;_data.mdf&amp;#39;&lt;/span&gt; &lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:blue;"&gt;SIZE&lt;/span&gt; &lt;span style="color:gray;"&gt;=&lt;/span&gt; 3072KB &lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:blue;"&gt;FILEGROWTH&lt;/span&gt; &lt;span style="color:gray;"&gt;=&lt;/span&gt; 1024KB &lt;span style="color:gray;"&gt;),&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;FILEGROUP&lt;/span&gt;
[SECONDARY]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:gray;"&gt;(&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:blue;"&gt;NAME&lt;/span&gt; &lt;span style="color:gray;"&gt;=&lt;/span&gt; N&lt;span style="color:red;"&gt;&amp;#39;&amp;lt;NomeDB, stringa, &amp;gt;_user&amp;#39;&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:blue;"&gt;FILENAME&lt;/span&gt; &lt;span style="color:gray;"&gt;=&lt;/span&gt; N&lt;span style="color:red;"&gt;&amp;#39;C:\Databases\&amp;lt;NomeDB,
stringa, &amp;gt;_user.ndf&amp;#39;&lt;/span&gt; &lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:blue;"&gt;SIZE&lt;/span&gt; &lt;span style="color:gray;"&gt;=&lt;/span&gt; 3072KB &lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:blue;"&gt;FILEGROWTH&lt;/span&gt; &lt;span style="color:gray;"&gt;=&lt;/span&gt; 1024KB &lt;span style="color:gray;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:fuchsia;"&gt;LOG&lt;/span&gt; &lt;span style="color:blue;"&gt;ON&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:gray;"&gt;(&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:blue;"&gt;NAME&lt;/span&gt; &lt;span style="color:gray;"&gt;=&lt;/span&gt; N&lt;span style="color:red;"&gt;&amp;#39;&amp;lt;NomeDB, stringa, &amp;gt;_log&amp;#39;&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:blue;"&gt;FILENAME&lt;/span&gt; &lt;span style="color:gray;"&gt;=&lt;/span&gt; N&lt;span style="color:red;"&gt;&amp;#39;C:\Databases\&amp;lt;NomeDB, stringa,
&amp;gt;_log.ldf&amp;#39;&lt;/span&gt; &lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:blue;"&gt;SIZE&lt;/span&gt;
&lt;span style="color:gray;"&gt;=&lt;/span&gt; 1024KB &lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:blue;"&gt;FILEGROWTH&lt;/span&gt; &lt;span style="color:gray;"&gt;=&lt;/span&gt; 10&lt;span style="color:gray;"&gt;%)&lt;/span&gt;&lt;br /&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;EXEC&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;&lt;span style="color:maroon;"&gt;sp_dbcmptlevel&lt;/span&gt;
@dbname&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;&amp;#39;&amp;lt;NomeDB,
stringa, &amp;gt;&amp;#39;&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; @new_cmptlevel&lt;span style="color:gray;"&gt;=&lt;/span&gt;90&lt;br /&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;IF&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:gray;"&gt;(&lt;/span&gt;1 &lt;span style="color:gray;"&gt;=&lt;/span&gt; &lt;span style="color:fuchsia;"&gt;FULLTEXTSERVICEPROPERTY&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;IsFullTextInstalled&amp;#39;&lt;/span&gt;&lt;span style="color:gray;"&gt;))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;begin&lt;br /&gt;EXEC&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:gray;"&gt;&amp;lt;&lt;/span&gt;NomeDB&lt;span style="color:gray;"&gt;,&lt;/span&gt; stringa&lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;gt;.&lt;/span&gt;[dbo]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[sp_fulltext_database] @action &lt;span style="color:gray;"&gt;=&lt;/span&gt; &lt;span style="color:red;"&gt;&amp;#39;disable&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;ALTER&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:blue;"&gt;DATABASE&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;lt;&lt;/span&gt;NomeDB&lt;span style="color:gray;"&gt;,&lt;/span&gt; stringa&lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;SET&lt;/span&gt; &lt;span style="color:blue;"&gt;ANSI_NULL_DEFAULT&lt;/span&gt; &lt;span style="color:blue;"&gt;OFF&lt;/span&gt;&lt;br /&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;ALTER&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:blue;"&gt;DATABASE&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;lt;&lt;/span&gt;NomeDB&lt;span style="color:gray;"&gt;,&lt;/span&gt; stringa&lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;SET&lt;/span&gt; &lt;span style="color:blue;"&gt;ANSI_NULLS&lt;/span&gt; &lt;span style="color:blue;"&gt;OFF&lt;/span&gt;&lt;br /&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;ALTER&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:blue;"&gt;DATABASE&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;lt;&lt;/span&gt;NomeDB&lt;span style="color:gray;"&gt;,&lt;/span&gt; stringa&lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;SET&lt;/span&gt; &lt;span style="color:blue;"&gt;ANSI_PADDING&lt;/span&gt; &lt;span style="color:blue;"&gt;OFF&lt;/span&gt;&lt;br /&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;ALTER&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:blue;"&gt;DATABASE&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;lt;&lt;/span&gt;NomeDB&lt;span style="color:gray;"&gt;,&lt;/span&gt; stringa&lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;SET&lt;/span&gt; &lt;span style="color:blue;"&gt;ANSI_WARNINGS&lt;/span&gt; &lt;span style="color:blue;"&gt;OFF&lt;/span&gt;&lt;br /&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;ALTER&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:blue;"&gt;DATABASE&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;lt;&lt;/span&gt;NomeDB&lt;span style="color:gray;"&gt;,&lt;/span&gt; stringa&lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;SET&lt;/span&gt; &lt;span style="color:blue;"&gt;ARITHABORT&lt;/span&gt; &lt;span style="color:blue;"&gt;OFF&lt;/span&gt;&lt;br /&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;ALTER&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:blue;"&gt;DATABASE&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;lt;&lt;/span&gt;NomeDB&lt;span style="color:gray;"&gt;,&lt;/span&gt; stringa&lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;SET&lt;/span&gt; &lt;span style="color:blue;"&gt;AUTO_CLOSE&lt;/span&gt; &lt;span style="color:blue;"&gt;OFF&lt;/span&gt;&lt;br /&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;ALTER&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:blue;"&gt;DATABASE&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;lt;&lt;/span&gt;NomeDB&lt;span style="color:gray;"&gt;,&lt;/span&gt; stringa&lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;SET&lt;/span&gt; &lt;span style="color:blue;"&gt;AUTO_CREATE_STATISTICS&lt;/span&gt; &lt;span style="color:blue;"&gt;ON&lt;/span&gt;&lt;br /&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;ALTER&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:blue;"&gt;DATABASE&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;lt;&lt;/span&gt;NomeDB&lt;span style="color:gray;"&gt;,&lt;/span&gt; stringa&lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;SET&lt;/span&gt; &lt;span style="color:blue;"&gt;AUTO_SHRINK&lt;/span&gt; &lt;span style="color:blue;"&gt;OFF&lt;/span&gt;&lt;br /&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;ALTER&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:blue;"&gt;DATABASE&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;lt;&lt;/span&gt;NomeDB&lt;span style="color:gray;"&gt;,&lt;/span&gt; stringa&lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;SET&lt;/span&gt; &lt;span style="color:blue;"&gt;AUTO_UPDATE_STATISTICS&lt;/span&gt; &lt;span style="color:blue;"&gt;ON&lt;/span&gt;&lt;br /&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;ALTER&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:blue;"&gt;DATABASE&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;lt;&lt;/span&gt;NomeDB&lt;span style="color:gray;"&gt;,&lt;/span&gt; stringa&lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;SET&lt;/span&gt; &lt;span style="color:blue;"&gt;CURSOR_CLOSE_ON_COMMIT&lt;/span&gt; &lt;span style="color:blue;"&gt;OFF&lt;/span&gt;&lt;br /&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;ALTER&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:blue;"&gt;DATABASE&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;lt;&lt;/span&gt;NomeDB&lt;span style="color:gray;"&gt;,&lt;/span&gt; stringa&lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;SET&lt;/span&gt; &lt;span style="color:blue;"&gt;CURSOR_DEFAULT&lt;/span&gt;&lt;span&gt;&amp;nbsp;
&lt;/span&gt;&lt;span style="color:blue;"&gt;GLOBAL&lt;/span&gt;&lt;br /&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;ALTER&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:blue;"&gt;DATABASE&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;lt;&lt;/span&gt;NomeDB&lt;span style="color:gray;"&gt;,&lt;/span&gt; stringa&lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;SET&lt;/span&gt; &lt;span style="color:blue;"&gt;CONCAT_NULL_YIELDS_NULL&lt;/span&gt; &lt;span style="color:blue;"&gt;OFF&lt;/span&gt;&lt;br /&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;ALTER&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:blue;"&gt;DATABASE&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;lt;&lt;/span&gt;NomeDB&lt;span style="color:gray;"&gt;,&lt;/span&gt; stringa&lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;SET&lt;/span&gt; &lt;span style="color:blue;"&gt;NUMERIC_ROUNDABORT&lt;/span&gt; &lt;span style="color:blue;"&gt;OFF&lt;/span&gt;&lt;br /&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;ALTER&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:blue;"&gt;DATABASE&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;lt;&lt;/span&gt;NomeDB&lt;span style="color:gray;"&gt;,&lt;/span&gt; stringa&lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;SET&lt;/span&gt; &lt;span style="color:blue;"&gt;QUOTED_IDENTIFIER&lt;/span&gt; &lt;span style="color:blue;"&gt;OFF&lt;/span&gt;&lt;br /&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;ALTER&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:blue;"&gt;DATABASE&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;lt;&lt;/span&gt;NomeDB&lt;span style="color:gray;"&gt;,&lt;/span&gt; stringa&lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;SET&lt;/span&gt; &lt;span style="color:blue;"&gt;RECURSIVE_TRIGGERS&lt;/span&gt; &lt;span style="color:blue;"&gt;OFF&lt;/span&gt;&lt;br /&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;ALTER&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:blue;"&gt;DATABASE&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;lt;&lt;/span&gt;NomeDB&lt;span style="color:gray;"&gt;,&lt;/span&gt; stringa&lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;SET&lt;/span&gt; &lt;span style="color:blue;"&gt;AUTO_UPDATE_STATISTICS_ASYNC&lt;/span&gt; &lt;span style="color:blue;"&gt;OFF&lt;/span&gt;&lt;br /&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;ALTER&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:blue;"&gt;DATABASE&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;lt;&lt;/span&gt;NomeDB&lt;span style="color:gray;"&gt;,&lt;/span&gt; stringa&lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;SET&lt;/span&gt; &lt;span style="color:blue;"&gt;DATE_CORRELATION_OPTIMIZATION&lt;/span&gt; &lt;span style="color:blue;"&gt;OFF&lt;/span&gt;&lt;br /&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;ALTER&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:blue;"&gt;DATABASE&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;lt;&lt;/span&gt;NomeDB&lt;span style="color:gray;"&gt;,&lt;/span&gt; stringa&lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;SET&lt;/span&gt; &lt;span style="color:blue;"&gt;PARAMETERIZATION&lt;/span&gt; &lt;span style="color:blue;"&gt;SIMPLE&lt;/span&gt;&lt;br /&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;ALTER&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:blue;"&gt;DATABASE&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;lt;&lt;/span&gt;NomeDB&lt;span style="color:gray;"&gt;,&lt;/span&gt; stringa&lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;SET&lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;READ_WRITE&lt;/span&gt;&lt;br /&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;ALTER&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:blue;"&gt;DATABASE&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;lt;&lt;/span&gt;NomeDB&lt;span style="color:gray;"&gt;,&lt;/span&gt; stringa&lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;SET&lt;/span&gt; &lt;span style="color:blue;"&gt;RECOVERY&lt;/span&gt; &lt;span style="color:blue;"&gt;FULL&lt;/span&gt;&lt;br /&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;ALTER&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:blue;"&gt;DATABASE&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;lt;&lt;/span&gt;NomeDB&lt;span style="color:gray;"&gt;,&lt;/span&gt; stringa&lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;SET&lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;MULTI_USER&lt;/span&gt;&lt;br /&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;ALTER&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:blue;"&gt;DATABASE&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;lt;&lt;/span&gt;NomeDB&lt;span style="color:gray;"&gt;,&lt;/span&gt; stringa&lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;SET&lt;/span&gt; &lt;span style="color:blue;"&gt;PAGE_VERIFY&lt;/span&gt; &lt;span style="color:blue;"&gt;CHECKSUM&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;USE&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:gray;"&gt;&amp;lt;&lt;/span&gt;NomeDB&lt;span style="color:gray;"&gt;,&lt;/span&gt; stringa&lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;IF&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:gray;"&gt;NOT&lt;/span&gt; &lt;span style="color:gray;"&gt;EXISTS&lt;/span&gt; &lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:blue;"&gt;SELECT&lt;/span&gt; &lt;span style="color:blue;"&gt;name&lt;/span&gt; &lt;span style="color:blue;"&gt;FROM&lt;/span&gt; &lt;span style="color:green;"&gt;sys.filegroups&lt;/span&gt; &lt;span style="color:blue;"&gt;WHERE&lt;/span&gt;
is_default&lt;span style="color:gray;"&gt;=&lt;/span&gt;1 &lt;span style="color:gray;"&gt;AND&lt;/span&gt;
&lt;span style="color:blue;"&gt;name&lt;/span&gt; &lt;span style="color:gray;"&gt;=&lt;/span&gt; N&lt;span style="color:red;"&gt;&amp;#39;SECONDARY&amp;#39;&lt;/span&gt;&lt;span style="color:gray;"&gt;)&lt;/span&gt; &lt;span style="color:blue;"&gt;ALTER&lt;/span&gt; &lt;span style="color:blue;"&gt;DATABASE&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;lt;&lt;/span&gt;NomeDB&lt;span style="color:gray;"&gt;,&lt;/span&gt; stringa&lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;MODIFY&lt;/span&gt; &lt;span style="color:blue;"&gt;FILEGROUP&lt;/span&gt;
[SECONDARY] &lt;span style="color:blue;"&gt;DEFAULT&lt;/span&gt;&lt;br /&gt;GO&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;Si puo notare che al posto di ogni nome database esiste un placeholder così formato:&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="color:gray;"&gt;&amp;lt;&lt;/span&gt;NomeDB&lt;span style="color:gray;"&gt;,&lt;/span&gt; stringa&lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;Come
possiamo usarlo? Come lo sostituiamo? Innanzitutto fate attenzione ai
percorsi e se non avete le cartelle, createle a priori, altrimenti
avrete un errore.&lt;br /&gt;&lt;br /&gt;1) Copiate lo script su management studio in una nuova query.&lt;br /&gt;2)
Premete CTRL+MIUSC+M (ho la versione in inglese di SSMS, quindi non
garantisco sullo shortcut) oppure aprite il menu Query --&amp;gt; Specify
Values for Template Parameters..&lt;br /&gt;3) Riempite la form che vi appare con i valori desiderati:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://blogs.dotnethell.it/filestore/6264_form.png" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;Come potete notare la form riassume proprio la struttura definita nel placeholder &lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="color:gray;"&gt;&amp;lt;&lt;/span&gt;NomeDB&lt;span style="color:gray;"&gt;,&lt;/span&gt; stringa&lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;. &lt;br /&gt;&lt;br /&gt;4) Date l&amp;#39;ok ed eseguite la query.&lt;br /&gt;&lt;br /&gt;Una
volta creato il vostro template, potete aggiungerlo a quelli
predefiniti di SQL Server, creando un nuovo modello direttamente dal
template explorer. &lt;br /&gt;&lt;br /&gt;&lt;img src="http://blogs.dotnethell.it/filestore/6265_new.png" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;Una volta creato, è sufficiente premere il destro sul template e selezionare Edit, creare il modello e salvare.&lt;br /&gt;Nel caso in cui si debba reinstallare il client o aggiornare la versione, ricordate che i template sono accessibili &lt;span style="font-style:italic;"&gt;Application
Data\Microsoft\Microsoft SQL Server\90\Tools\Shell\Templates (SQL
SERVER 2005 su sistema operativo in INGLESE, in italiano la cartella è
Dati Aplicazioni).&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Stay Tuned &lt;img src="http://blogs.dotnethell.it/icons/ThumbUp2.gif" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;/span&gt;&lt;span style="font-style:italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://community.ugiss.org/aggbug.aspx?PostID=3761" width="1" height="1"&gt;</content><author><name>sux_stellino</name><uri>http://community.ugiss.org/members/sux_5F00_stellino.aspx</uri></author><category term="T-SQL tips" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/T-SQL+tips/default.aspx" /><category term="SQL Server 2005" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SQL+Server+2005/default.aspx" /><category term="Sql Server Management Studio" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/Sql+Server+Management+Studio/default.aspx" /><category term="SSMS" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SSMS/default.aspx" /></entry><entry><title>[SSIS] Articolo sui SSIS Log Providers</title><link rel="alternate" type="text/html" href="http://community.ugiss.org/blogs/sux_stellino/archive/2008/04/03/articolo-sui-ssis-log-providers.aspx" /><id>http://community.ugiss.org/blogs/sux_stellino/archive/2008/04/03/articolo-sui-ssis-log-providers.aspx</id><published>2008-04-03T15.45.00Z</published><updated>2008-04-03T15.45.00Z</updated><content type="html">&lt;p&gt;Grazie all&amp;#39;impegno di &lt;a href="http://blogs.dotnethell.it/david" target="_blank"&gt;David&lt;/a&gt;, che ho stressato molto per la pubblicazione di alcuni miei articoli, è online &amp;quot;&lt;a href="http://www.dotnethell.it/articles/Logging-SQL-SSIS-Integration-Services.aspx" target="_blank"&gt;Il logging con Integration Services&lt;/a&gt;&amp;quot;.&lt;br /&gt;&lt;br /&gt;&amp;quot;Perchè si è bloccata la mia applicazione? Che errori si sono verificati? 
Perchè il flusso d&amp;#39;esecuzione non procede nel modo corretto? &lt;img src="http://blogs.dotnethell.it/icons/Question.gif" alt="" /&gt; Cerchiamo di 
capire come possono esserci utili le funzionalità di logging offerte da SQL 
Server e gli Integration Services per rendere più affidabili e consistenti le 
nostre applicazioni&amp;quot;.&lt;br /&gt;&lt;br /&gt;Aspetto commenti e critiche &lt;img src="http://blogs.dotnethell.it/icons/HugeSmile.gif" alt="" /&gt; .. spero possa comunque esservi di aiuto.&lt;br /&gt;&lt;br /&gt;Stay Tuned! &lt;img src="http://blogs.dotnethell.it/icons/ThumbUp2.gif" alt="" /&gt; &lt;br /&gt;&lt;/p&gt;&lt;img src="http://community.ugiss.org/aggbug.aspx?PostID=3709" width="1" height="1"&gt;</content><author><name>sux_stellino</name><uri>http://community.ugiss.org/members/sux_5F00_stellino.aspx</uri></author><category term="SSIS tips" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SSIS+tips/default.aspx" /><category term="SSIS in generale" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SSIS+in+generale/default.aspx" /><category term="SQL Server 2005" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SQL+Server+2005/default.aspx" /><category term="SSIS" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SSIS/default.aspx" /></entry><entry><title>[SSIS] I Checkpoint - Workaround Foreach Loop</title><link rel="alternate" type="text/html" href="http://community.ugiss.org/blogs/sux_stellino/archive/2008/03/18/ssis-i-checkpoint-workaround-foreach-loop.aspx" /><id>http://community.ugiss.org/blogs/sux_stellino/archive/2008/03/18/ssis-i-checkpoint-workaround-foreach-loop.aspx</id><published>2008-03-18T20.42.00Z</published><updated>2008-03-18T20.42.00Z</updated><content type="html">&lt;p&gt;&amp;nbsp;In questo mio &lt;a href="http://blogs.dotnethell.it/suxstellino/I-Checkpoint__13108.aspx" target="_blank"&gt;post&lt;/a&gt;, definivo le caratteristiche dei checkpoint ed un&amp;#39;introduzione alla funzionalità di SSIS.&lt;br /&gt;&lt;br /&gt;Vi sono casi particolari, come quello indicato in questo &lt;a href="http://groups.google.com/group/microsoft.public.it.sql/browse_thread/thread/3e0ba7783ed3d819" target="_blank"&gt;thread&lt;/a&gt;
su microsoft.public.it.sql, che necessitano di alcuni workaround per
portare dalla propria parte lo svantaggio che il For each Loop
container ha con i checkpoint &lt;img src="http://blogs.dotnethell.it/icons/wink_smile.gif" alt="" /&gt;.&amp;nbsp; Nel &lt;a href="http://groups.google.com/group/microsoft.public.it.sql/browse_thread/thread/3e0ba7783ed3d819" target="_blank"&gt;thread&lt;/a&gt;
indicato, vi è una semplice richiesta. Ottenere un Sequence container
che, in caso di errore, non rispetti le semplici condizioni di
checkpoint e che quindi si riavvii per intero. Comportandosi
naturalmente, al contrario, il task che ha generato l&amp;#39;errore
all&amp;#39;interno del contenitore è quello che verrà eseguito per primo al
riavvio, ignorando i precedenti.&lt;br /&gt;
&lt;br /&gt;
Il workaround è semplice:&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;- impostare la proprietà &lt;span style="font-weight:bold;"&gt;FailPackageOnFailure &lt;/span&gt;a false in TUTTI i task interni ai sequence container  &lt;br /&gt; - Aggiungere in ogni sequence container un Foreach Loop container &lt;br /&gt; - Impostare il Foreach Loop container con l&amp;#39;enumeratore &amp;quot;Item&amp;quot; &lt;br /&gt; - Aggiungere sotto una colonna di tipo intero ad esempio (un item con un qualunque valore) &lt;br /&gt; - Impostare la proprietà &lt;span style="font-weight:bold;"&gt;FailPackageOnFailure &lt;/span&gt;del Foreach Loop a true &lt;br /&gt; - Spostare tutti i task che erano nel sequence container all&amp;#39;interno del Foreach Loop container &lt;br /&gt; - Impostare la proprietà &lt;span style="font-weight:bold;"&gt;FailParentOnFailure &lt;/span&gt;di ogni task (di primo livello) interno al Loop a true &lt;br /&gt; - Imposta la proprietà CheckpointUsage del package a &lt;span style="font-weight:bold;"&gt;IfExists &lt;/span&gt;e la &lt;span style="font-weight:bold;"&gt;FailPackageOnFailure &lt;/span&gt;del package a &lt;span style="font-style:italic;"&gt;false &lt;/span&gt;(con &lt;span style="font-weight:bold;"&gt;CheckpointFileName &lt;/span&gt;= &lt;span style="font-style:italic;"&gt;&amp;quot;path/file.chk&amp;quot;&lt;/span&gt; e &lt;span style="font-weight:bold;"&gt;SaveCheckpoints &lt;/span&gt;= &lt;span style="font-style:italic;"&gt;true&lt;/span&gt;)  &lt;/p&gt;
La chiave è quella di sfruttare al meglio lo svantaggio del foreach &lt;img src="http://blogs.dotnethell.it/icons/wink_smile.gif" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;In materia di checkpoint (e non solo), consiglio un &lt;a href="http://www.jumpstarttv.com/Media.aspx?vid=5" target="_blank"&gt;video&lt;/a&gt; di &lt;a href="http://www.whiteknighttechnology.com/cs/blogs/brian_knight/" target="_blank"&gt;Brian Knight&lt;/a&gt;, su &lt;a href="http://www.jumpstarttv.com/" target="_blank"&gt;jumpstartTV&lt;/a&gt;. Non fatevi ingannare dalla signora prima del video di Brian, è solo pubblicità; non c&amp;#39;entra con SQL Server &lt;img src="http://blogs.dotnethell.it/icons/tounge_smile.gif" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;Stay tuned! &lt;img src="http://blogs.dotnethell.it/icons/ThumbUp2.gif" alt="" /&gt;&lt;br /&gt;&lt;img src="http://community.ugiss.org/aggbug.aspx?PostID=3566" width="1" height="1"&gt;</content><author><name>sux_stellino</name><uri>http://community.ugiss.org/members/sux_5F00_stellino.aspx</uri></author><category term="SSIS tips" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SSIS+tips/default.aspx" /><category term="SSIS in generale" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SSIS+in+generale/default.aspx" /><category term="SQL Server 2005" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SQL+Server+2005/default.aspx" /><category term="SSIS" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SSIS/default.aspx" /></entry><entry><title>[SSIS] I Checkpoint</title><link rel="alternate" type="text/html" href="http://community.ugiss.org/blogs/sux_stellino/archive/2008/03/18/ssis-i-checkpoint.aspx" /><id>http://community.ugiss.org/blogs/sux_stellino/archive/2008/03/18/ssis-i-checkpoint.aspx</id><published>2008-03-18T20.38.00Z</published><updated>2008-03-18T20.38.00Z</updated><content type="html">&lt;p&gt;SSIS 2005 possiede una importante funzionalità, quella dei &lt;span style="font-style:italic;"&gt;Checkpoint&lt;/span&gt;. Ogni pacchetto, opportunamente configurato, può creare e gestire un &lt;span style="font-style:italic;"&gt;checkpoint file&lt;/span&gt;,
in grado di memorizzare gli stati del package a runtime. Detto in
parole povere, il checkpoint consente di ripristinare una situazione
corrispondente al verificarsi di un errore.&lt;br /&gt;Ogni volta che si
verifica un errore il file di checkpoint viene scritto ed un
particolare record in formato xml viene accodato agli eventuali
precedenti. Una volta che il pacchetto termina l&amp;#39;esecuzione con
successo cancella il file di checkpoint, per ripristinare lo stato
iniziale di esecuzione.&lt;br /&gt;&lt;br /&gt;Ovviamente una tecnologia semplice come
questa può risolverci alcuni problemi ed alleggerire in generale il
carico dei server o della rete inclusa nella logica di
importazione/trasformazione.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;Quali sono i vantaggi dei checkpoint?&lt;/span&gt;&lt;br /&gt;-
Come già detto, evitare di ripetere alcune operazioni. Immaginiamo
infatti particolari inserimenti o modifiche che non devono essere
ripetuti. In questo caso possiamo evitare di scrivere logiche di
controllo potenzialmente pesanti.&lt;br /&gt;- Evitare di ricaricare grandi quantità di dati, riducendo l&amp;#39;eventuale carico di rete congiunto&lt;br /&gt;- Evitare di ricaricare file di grandi dimensioni, riducendo anche qui il carico di rete&lt;br /&gt;- Evitare di ripetere eventuali aggregazioni&lt;br /&gt;&lt;br /&gt;Il record scritto nel file di checkpoint contiene anche i valori correnti delle variabili, escluse quelle reference type (&lt;span style="font-weight:bold;"&gt;object&lt;/span&gt;).&lt;br /&gt;L&amp;#39;unità più piccola che può essere riavviata è il task (o meglio l&amp;#39;&lt;span style="font-weight:bold;"&gt;host container invisibile che lo contiene&lt;/span&gt;). Anche alcuni contenitori come il &lt;a href="http://blogs.dotnethell.it/suxstellino/I-container-ed-il-grouping__5683.aspx" target="_blank"&gt;&lt;span style="font-style:italic;"&gt;Sequence Container&lt;/span&gt; &lt;/a&gt;sono
considerati come unità riavviabili. Mentre però in un Sequence
Container il task che ha generato l&amp;#39;errore dirige il riavvio, è
necessario fare particolare attenzione al &lt;a href="http://blogs.dotnethell.it/suxstellino/I-container-ed-il-grouping__5683.aspx" target="_blank"&gt;&lt;span style="font-style:italic;"&gt;For each loop container&lt;/span&gt;&lt;/a&gt;.
Infatti, con un errore, la riesecuzione riparte da zero e quindi
l&amp;#39;enumeratore riparte dal primo elemento della collezione ciclata. Non
è possibile riprendere da una particolare iterazione. Questo può essere
un comportamento non voluto e quindi uno degli &lt;span style="font-weight:bold;"&gt;svantaggi &lt;/span&gt;più evidenti del &lt;a href="http://blogs.dotnethell.it/suxstellino/I-container-ed-il-grouping__5683.aspx" target="_blank"&gt;&lt;span style="font-style:italic;"&gt;Foreach loop container&lt;/span&gt;&lt;/a&gt;.
Immaginate ad esempio un ciclo foreach che esegue n transazioni (ad
esempio n inserimenti). In caso di errore durante un inserimento
diverso dal primo il package è pensato per scrivere sul checkpoint che
il ciclo è andato in errore. La riesecuzione forza tutti i cicli del
container come &amp;quot;da rieseguire&amp;quot;, ripartendo dal primo. Questo può
portare un vero e proprio errore anche sulla qualità del dato.&lt;br /&gt;&lt;br /&gt;Ci sono tre variabili delle quali tenere conto durante l&amp;#39;impostazione di un package per supportare i checkpoint:&lt;br /&gt;- &lt;b&gt;CheckpointFileName&lt;/b&gt; &lt;br /&gt;- &lt;b&gt;CheckpointUsage&lt;/b&gt; &lt;br /&gt;- &lt;b&gt;SaveCheckpoints&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;La
prima definisce il nome del file per il checkpoint (non vi è la
possibilità di impostare un connection manager, ma per rendere dinamico
il percorso è sufficiente definire un&amp;#39;Expression che imposta il nome
stesso). La seconda è un enum che definisce qual è l&amp;#39;utilizzo del
checkpoint file e la terza, se valorizzata a true, impone il
salvataggio del checkpoint per ripartire dall&amp;#39;ultimo errore incontrato.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;CheckpointUsage&lt;/span&gt; può assumere a sua volta tre valori:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Never&lt;/span&gt;,&lt;span style="font-weight:bold;"&gt; &lt;/span&gt;Il package non utilizza il file dei checkpoint&lt;br style="font-weight:bold;" /&gt;&lt;span style="font-weight:bold;"&gt;- Always&lt;/span&gt;, Il package usa sempre il file del chackpoint e se non lo trova restituisce errore&lt;span style="font-weight:bold;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;- IfExists&lt;/span&gt;, Il package utilizza il file se esiste. In caso contrario prosegue l&amp;#39;esecuzione&lt;br style="font-weight:bold;" /&gt;&lt;br /&gt;Altra proprietà da utilizzare in concomitanza con la definizione dei checkpoint è la &lt;b&gt;FailPackageOnFailure&lt;/b&gt;.
Questa proprietà, se valorizzata a true ed in caso di errore del task
che la possiede, scatena l&amp;#39;evento per la scrittura del checkpoint sul
file.&lt;br /&gt;&lt;br /&gt;Ecco come si presenta un file di checkpoint:&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;DTS:Checkpoint&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:red;"&gt;xmlns:DTS&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;quot;&lt;span style="color:blue;"&gt;www.microsoft.com/SqlServer/Dts&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;DTS:PackageID&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;{CF9B140D-67D3-4D86-AF08-87C2C1DCBA3A}&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;DTS:Variables&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:red;"&gt;DTS:ContID&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;quot;&lt;span style="color:blue;"&gt;{CF9B140D-67D3-4D86-AF08-87C2C1DCBA3A}&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;DTS:Variable&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&amp;gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;DTS:Property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:red;"&gt;DTS:Name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;quot;&lt;span style="color:blue;"&gt;Expression&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;DTS:Property&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;DTS:Property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:red;"&gt;DTS:Name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;quot;&lt;span style="color:blue;"&gt;EvaluateAsExpression&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;0&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;DTS:Property&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;DTS:Property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:red;"&gt;DTS:Name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;quot;&lt;span style="color:blue;"&gt;Namespace&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;User&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;DTS:Property&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;DTS:Property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:red;"&gt;DTS:Name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;quot;&lt;span style="color:blue;"&gt;ReadOnly&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;0&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;DTS:Property&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;DTS:Property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:red;"&gt;DTS:Name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;quot;&lt;span style="color:blue;"&gt;RaiseChangedEvent&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;0&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;DTS:Property&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;DTS:VariableValue&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:red;"&gt;DTS:DataType&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;quot;&lt;span style="color:blue;"&gt;3&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;0&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;DTS:VariableValue&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;DTS:Property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:red;"&gt;DTS:Name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;quot;&lt;span style="color:blue;"&gt;ObjectName&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;var1&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;DTS:Property&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;DTS:Property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:red;"&gt;DTS:Name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;quot;&lt;span style="color:blue;"&gt;DTSID&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;{8758E0D8-E786-4497-BE6F-8146F9D6FBA3}&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;DTS:Property&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;DTS:Property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:red;"&gt;DTS:Name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;quot;&lt;span style="color:blue;"&gt;Description&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;DTS:Property&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;DTS:Property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:red;"&gt;DTS:Name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;quot;&lt;span style="color:blue;"&gt;CreationName&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;DTS:Property&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;DTS:Variable&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&amp;gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;DTS:Variables&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&amp;gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;DTS:Container&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:red;"&gt;DTS:ContID&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;quot;&lt;span style="color:blue;"&gt;{005F0094-ED1D-41C5-88BF-F6E6E13D1BBF}&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;DTS:Result&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;DTS:PrecedenceMap&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&amp;quot;&lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;line-height:115%;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:10pt;line-height:115%;font-family:&amp;#39;Courier New&amp;#39;;"&gt;DTS:Checkpoint&lt;/span&gt;&lt;span style="font-size:10pt;line-height:115%;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
Si tratta di un XML file che contiene le informazioni leggibili dei
task che sono andati in errore. Molto semplice da leggere e da capire.
Una sezione di intestazione del checkpoint, un eventuale elenco di
variabili e le relative proprietà, il container di riferimento, ecc. &lt;br /&gt;&lt;br /&gt;Ho
trovato questa funzionalità estremamente utile nei casi di scratch
load. Poter fermare il package in caso di errore mentre si stanno
caricando grandi quantità di dati da enormi file di testo, con la
garanzia di poter ripartire da un determinato punto, è del tutto
vantaggioso. &lt;br /&gt;&lt;br /&gt;Stay tuned! &lt;img src="http://blogs.dotnethell.it/icons/ThumbUp2.gif" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://community.ugiss.org/aggbug.aspx?PostID=3565" width="1" height="1"&gt;</content><author><name>sux_stellino</name><uri>http://community.ugiss.org/members/sux_5F00_stellino.aspx</uri></author><category term="SSIS tips" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SSIS+tips/default.aspx" /><category term="SSIS in generale" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SSIS+in+generale/default.aspx" /><category term="SQL Server 2005" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SQL+Server+2005/default.aspx" /><category term="SSIS" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SSIS/default.aspx" /></entry><entry><title>[SSIS] Dataflow - Le trasformazioni - Conditional Split</title><link rel="alternate" type="text/html" href="http://community.ugiss.org/blogs/sux_stellino/archive/2008/02/24/ssis-dataflow-le-trasformazioni-conditional-split.aspx" /><id>http://community.ugiss.org/blogs/sux_stellino/archive/2008/02/24/ssis-dataflow-le-trasformazioni-conditional-split.aspx</id><published>2008-02-24T16.55.00Z</published><updated>2008-02-24T16.55.00Z</updated><content type="html">
&lt;p&gt;Abbiamo già accennato in questo &lt;a href="http://blogs.dotnethell.it/suxstellino/SSIS-SkipRow-e-Conditional-Split__11035.aspx" target="_blank"&gt;post&lt;/a&gt;
l&amp;#39;utilizzo del Conditional Split transform per saltare le righe in un
determinato flusso di input. Le principali caratteristiche sono quindi
già state evidenziate, e sono:&lt;br /&gt;- In quanto trasformazione, sta all&amp;#39;interno di un dataflow e non può essere il primo task della trasformazione stessa.&lt;br /&gt;- In quanto trasformazione, possiede un input ed n output (uno per condizione creata più uno per la condizione di default)&lt;br /&gt;- In input riceve quello che arriva da un task precedente e lo gestisce in base alle condizioni create&lt;br /&gt;- Possiamo indicare nelle espressioni di condizione sia variabili che colonne&lt;br /&gt;&lt;br /&gt;In
aggiunta ad esse vi è l&amp;#39;advanced editor anche se le proprietà avanzate
non sono molto importanti. Diciamo che l&amp;#39;editor di default è più che
sufficiente per configurare il componente al meglio.&lt;br /&gt;Solo un&amp;#39;opzione, la &lt;span style="font-style:italic;"&gt;ValidateExternalMetadata&lt;/span&gt;,
può esserci di aiuto nell&amp;#39;editor avanzato. Essa serve infatti per
decidere se validare i metadati esterni al componente a design time:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://technet.microsoft.com/en-us/library/microsoft.sqlserver.dts.pipeline.wrapper.idtscomponentmetadata90.validateexternalmetadata.aspx"&gt;&lt;span style="font-style:italic;"&gt;IDTSComponentMetaData90.ValidateExternalMetadata Property&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Può
essere utile, ad esempio, se le condizioni del componente sono create a
runtime e quindi per quelle condizioni i cui metadatai ancora non
esistono. Lasciando a true la proprietà &lt;span style="font-style:italic;"&gt;ValidateExternalMetadata&lt;/span&gt;
in un caso come questo, otterremmo un errore in fase di design, il che
impedirebbe il corretto caricamento del pacchetto in fase di editing e,
a volte, anche di esecuzione. Ricordiamo che questa proprietà non è
riservata al task Conditional Split, bensì a tutti i task di
trasformazione di SSIS (tutti i task di un dataflow).&lt;br /&gt;&lt;br /&gt;Per dare una ulteriore overview del task, vediamo come esso può risultare utile per la gestione dei NULL.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Scenario&lt;/span&gt;&lt;br /&gt;Partendo
da un foglio excel contenente i contatti di una rubrica, dobbiamo
caricare questi dati su SQL Server 2005. Il campo email sul foglio
excel può essere non riempito ma su SQL Server non è consentito
l&amp;#39;inserimento di NULL. Se la email risulta mancante, si dovrà inserire
su sql server il valore stringa &amp;quot;N/A&amp;quot;.&lt;br /&gt;&lt;br /&gt;Ecco come procedere:&lt;br /&gt;&lt;br /&gt;1) creare un connection manager per i contatti&lt;br /&gt;2) creare un dataflow che conterrà la trasformazione&lt;br /&gt;3) aggiungere una sorgente Excel e definire il record&lt;br /&gt;4) legare all&amp;#39;output della sorgente il conditional split per gestire i NULL&lt;br /&gt;5) mettere unione i dati non NULL con quelli NULL gestiti dal conditional split&lt;br /&gt;6) inserire su tabella SQL Server&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1) Per creare il connection manager dobbiamo aggiungerne uno non presente nel menu rapido. Dovremo utilizzare &lt;span style="font-style:italic;"&gt;New Connection..&lt;/span&gt;:&lt;br /&gt;&lt;a href="http://blogs.dotnethell.it/filestore/6110_excelconn.jpg" target="_blank"&gt;&lt;img src="http://blogs.dotnethell.it/filestore/6110_excelconn.jpg" style="width:508px;height:471px;" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ho
spuntato il flag proprio perchè la prima riga del mio excel ha i nomi
delle colonne. Ricordarsi di deselezionarlo nel caso contrario &lt;img src="http://blogs.dotnethell.it/icons/wink_smile.gif" alt="" /&gt;&lt;br /&gt;Dopo aver confermato, ho rinominato il connection manager in Contatti. &lt;br /&gt;&lt;br /&gt;3) Ecco i dati in anteprima ottenuti legando il connection manager alla sorgente Excel:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.dotnethell.it/filestore/6111_previewdata.jpg" target="_blank"&gt;&lt;img src="http://blogs.dotnethell.it/filestore/6111_previewdata.jpg" height="362" width="578" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Come possiamo notare i dati con id 5,6,7,8,9 non hanno la mail valorizzata e l&amp;#39;informazione è NULL.&lt;br /&gt;&lt;br /&gt;4) Ecco come gestire il null nella conditional split:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.dotnethell.it/filestore/6112_csplit.jpg" target="_blank"&gt;&lt;img src="http://blogs.dotnethell.it/filestore/6112_csplit.jpg" height="465" width="586" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Avremo
in output due rami, uno, che per noi è quello corretto, con le email
valorizzate, l&amp;#39;altro, da gestire poichè la colonna email è NULL.
Possiamo ad esempio aggiungere un derived column per inserire nel
valore NULL la stringa &amp;quot;N/A&amp;quot;:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.dotnethell.it/filestore/6113_derived.jpg" target="_blank"&gt;&lt;img src="http://blogs.dotnethell.it/filestore/6113_derived.jpg" height="257" width="609" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A questo punto siamo pronti ad unire i risultati per ottenere un resultset &amp;quot;pulito&amp;quot; e pronto da inserire su SQL Server.&lt;br /&gt;&lt;br /&gt;5)
Utilizzando il task Union All andiamo ad unire i dati gestiti dal
Derived Column con quelli già &amp;quot;puliti&amp;quot; uscenti dalla condizione di
default del Conditional Split:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.dotnethell.it/filestore/6114_union.jpg" target="_blank"&gt;&lt;img src="http://blogs.dotnethell.it/filestore/6114_union.jpg" height="506" width="611" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Come
possiamo vedere dal primo data viewer (ricordiamo che un dataviewer è
un insieme di informazioni che ci consentono di eseguire debug e stime
sui dati) abbiamo i dati gestiti dal Derived Column &amp;quot;&lt;span style="font-style:italic;"&gt;Stringa Not Available&lt;/span&gt;&amp;quot;. Nel secondo abbiamo i dati uscenti dal Conditional Split &amp;quot;&lt;span style="font-style:italic;"&gt;email NULL&lt;/span&gt;&amp;quot;
mentre nel terzo abbiamo l&amp;#39;unione dei due resultset in uno solo. Questi
ultimi sono i dati che effettivamente saranno inseriti in SQL Server.&lt;br /&gt;&lt;br /&gt;Stay Tuned! &lt;img src="http://blogs.dotnethell.it/icons/ThumbUp2.gif" alt="" /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;img src="http://community.ugiss.org/aggbug.aspx?PostID=3380" width="1" height="1"&gt;</content><author><name>sux_stellino</name><uri>http://community.ugiss.org/members/sux_5F00_stellino.aspx</uri></author><category term="SSIS tips" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SSIS+tips/default.aspx" /><category term="SSIS in generale" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SSIS+in+generale/default.aspx" /><category term="SQL Server 2005" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SQL+Server+2005/default.aspx" /><category term="SSIS" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SSIS/default.aspx" /><category term="DataFlow" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/DataFlow/default.aspx" /></entry><entry><title>[SSIS] Qualche problema con SP2</title><link rel="alternate" type="text/html" href="http://community.ugiss.org/blogs/sux_stellino/archive/2008/02/11/ssis-qualche-problema-con-sp2.aspx" /><id>http://community.ugiss.org/blogs/sux_stellino/archive/2008/02/11/ssis-qualche-problema-con-sp2.aspx</id><published>2008-02-11T10.14.00Z</published><updated>2008-02-11T10.14.00Z</updated><content type="html">&lt;p&gt;L&amp;#39;altro giorno ho riscontrato un problema noioso sul service pack 2 di sql server per quanto riguarda Integration Services.&lt;br /&gt;&lt;br /&gt;Scenario&lt;br /&gt;Sistema
cluster windows 2003, failover di SQL Server 2005 a 64bit.
Installazione nuovo ambiente, e quindi installazione SQL Server in
cluster, installazione dei client tools, di SSIS e di VSBIDS (Business
Intelligence Development Studio). Successivamente, Service Pack 2, per
tutto.&lt;br /&gt;&lt;br /&gt;Ebbene, dopo l&amp;#39;installazione di SP2, sembra andare tutto
bene fino a che mi accorgo che Visual Studio BIDS non funziona più..
Non riesco a creare package nuovi, non riesco a fare debug di già
esistenti, ed ottengo errori di vario genere, come ad esempio:&lt;br /&gt;&lt;br /&gt;&amp;quot;&lt;span style="font-style:italic;"&gt;Microsoft Visual Studio is unable to load this document:&lt;/span&gt;&lt;br style="font-style:italic;" /&gt;&lt;span style="font-style:italic;"&gt;The package
failed to load due to error 0xC0010014 “One or more error occurred.
There should be more specific errors preceding this one that explains
the details of the errors. This message is used as a return value from
functions that encounter errors.”. This occurs when
CPackage::LoadFormXML fails.&lt;/span&gt;&amp;quot;&lt;br /&gt;&lt;br /&gt;Partendo da questo messaggio non ho trovato nulla che potesse aiutarmi.&lt;br /&gt;&lt;a href="http://community.ugiss.org/blogs/dmauri/" title="Davide Mauri" target="_blank"&gt;Davide&lt;/a&gt;,
non conoscendo bene il problema che avevo di fronte, mi ha passato un
paio di link, che purtroppo non erano adatti al mio scopo..&lt;br /&gt;&lt;br /&gt;Il
week end è passato e questa mattina mi arriva una email simpatica di
Leo, un mio &amp;quot;amico/collega/cliente&amp;quot; che mi insulta un po&amp;#39; e mi dona
questo link:&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;a href="http://support.microsoft.com/kb/919224" target="_blank" title="blocked::http://support.microsoft.com/kb/919224"&gt;http://support.microsoft.com/kb/919224&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2 class="subTitle" id="tocHeadRef"&gt;CAUSE&lt;/h2&gt;loadTOCNode(1, &amp;#39;cause&amp;#39;);&lt;span style="font-style:italic;"&gt;&amp;quot;This
problem occurs because the installer unregisters the 32-bit Dts.dll
file when the installer installs the 64-bit Dts.dll file. The 64-bit
Dts.dll file is installed together with SQL Server 2005 SP2.
Additionally, the 64-bit Dts.dll file may be installed together with
any SSIS hotfix package that contains the 64-bit Dts.dll file.&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;Semplicemente risolto con il metodo indicato..&lt;br /&gt;Comunque un &amp;quot;bel&amp;quot; bug.. voi che ne pensate?&lt;br /&gt;&lt;br /&gt;Stay tuned! &lt;img src="http://blogs.dotnethell.it/icons/ThumbUp2.gif" alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://community.ugiss.org/aggbug.aspx?PostID=3273" width="1" height="1"&gt;</content><author><name>sux_stellino</name><uri>http://community.ugiss.org/members/sux_5F00_stellino.aspx</uri></author><category term="SSIS tips" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SSIS+tips/default.aspx" /><category term="SSIS in generale" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SSIS+in+generale/default.aspx" /><category term="SSIS" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SSIS/default.aspx" /><category term="SSIS Hotfix" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SSIS+Hotfix/default.aspx" /><category term="Cluster" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/Cluster/default.aspx" /><category term="SSIS bug" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SSIS+bug/default.aspx" /></entry><entry><title>[SSIS] Dataflow - Le trasformazioni - Sort e Aggregate</title><link rel="alternate" type="text/html" href="http://community.ugiss.org/blogs/sux_stellino/archive/2008/01/19/ssis-dataflow-le-trasformazioni-sort-e-aggregate.aspx" /><id>http://community.ugiss.org/blogs/sux_stellino/archive/2008/01/19/ssis-dataflow-le-trasformazioni-sort-e-aggregate.aspx</id><published>2008-01-19T18.43.00Z</published><updated>2008-01-19T18.43.00Z</updated><content type="html">&lt;p&gt;&amp;nbsp;Proseguiamo con le &lt;a href="http://blogs.dotnethell.it/suxstellino/I-DataFlow-le-trasformazioni__12339.aspx" target="_blank"&gt;trasformazioni&lt;/a&gt;, ormai mancano pochi post &lt;img src="http://blogs.dotnethell.it/icons/regular_smile.gif" alt="" /&gt;. Poi passeremo alla versione 2008 per capire anche come cambiano i componenti. Come abbiamo già visto in &lt;a href="http://blogs.dotnethell.it/suxstellino/Primi-passi-con-SSIS-2008-I-miglioramenti-del-lookup-transform__12671.aspx" target="_blank"&gt;questo post&lt;/a&gt;
il Lookup component ha migliorato di molto la gestione della cache e
del match. Alcuni componenti rimarranno simili ai predecessori, ma in
linea di massima, essendo SSIS 2005 un prodotto riscritto interamente,
troveremo tante migliorie e comodità in più.&lt;br /&gt;Ma torniamo a noi. Parleremo di due semplici trasformazioni, il &lt;span style="font-style:italic;"&gt;Sort Transformation &lt;/span&gt;e l&amp;#39;&lt;span style="font-style:italic;"&gt;Aggregation Transformation&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Sort Transformation&lt;br /&gt;&lt;/span&gt;Come
già il nome indica il sort è un componente in grado di ordinare i dati.
Riceve quindi in input un resultset e lo restituisce ordinato in base
ai criteri definiti al suo interno. In base all&amp;#39;ordine con cui sono
state selezionate le colonne viene effettuato l&amp;#39;ordinamento. Se si
selezionano tre colonne, l&amp;#39;ordinamente viene effettuato prima per la
prima selezionata, poi per la seconda ed infine per la terza. Inoltre
vi è una funzionalità alternativa che permette di rimuovere le righe
duplicate in base alle colonne selezionate per l&amp;#39;ordinamento. Questo
componente risulta molto utile quando è necessario eseguire una Merge
Join (ne parleremo nei prossimi post). Quest&amp;#39;ultimo infatti, si aspetta
in input resultset ordinati. Prendiamo il seguente esempio:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Scenario&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Due server di natura differente SRV01 e SRV02. Nel primo ho un&amp;#39;anagrafica di &lt;span style="font-weight:bold;"&gt;utenti&lt;/span&gt;, nel secondo ho i &lt;span style="font-weight:bold;"&gt;dettagli&lt;/span&gt;
dell&amp;#39;utente che non sono gestiti nelle applicazioni del primo server.
Ho la necessità di collegare gli utenti con i relativi dettagli per
poter scrivere su di una tabella presente su SRV01. Immaginiamo un
dataflow simile a questo:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://blogs.dotnethell.it/filestore/5946_mergejoindataflow.jpg" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;Siccome
dobbiamo legare le due sorgenti provenienti da server differenti,
possiamo utilizzare il task Merge Join. Rimuovendo il sort si ottiene
un errore restituito dal package a design time: &lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&amp;quot;The IsSorted Property must be set to true on both sources of this transformation&amp;quot;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Anche
aggiungendo l&amp;#39;order by nel comando sorgente il problema rimane. Il sort
transformation risolve questo problema. A dire il vero, questo non è
l&amp;#39;unico metodo. &lt;br /&gt;In &lt;a href="http://www.dotnethell.it/tips/SSIS-IsSorted-Property.aspx" title="IsSorted Property" target="_blank"&gt;questo tip&lt;/a&gt; infatti vi è la procedura per impostare la proprietà IsSorted a True. Dategli una letta &lt;img src="http://blogs.dotnethell.it/icons/wink_smile.gif" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;Abbiamo visto che il sort ordina i resultset. Ora vediamo com&amp;#39;è nel dettaglio:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://blogs.dotnethell.it/filestore/5947_sort.jpg" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;E
molto semplice ed intuitivo, ha una sola form tramite la quale è
possibile selezionare tre opzioni. Il primo flag a sinistra seleziona
la colonna o le colonne che devono essere ordinate. Il secondo flag,
denominato &lt;span style="font-style:italic;"&gt;Pass Through&lt;/span&gt; serve per determinare se &amp;quot;&lt;i&gt;&lt;span style="text-decoration:underline;"&gt;inoltrare&lt;/span&gt;&lt;/i&gt;&amp;quot; la colonna nell&amp;#39;output. Quando il checkbox è deselezionato, l&amp;#39;output non possiede la colonna relativa.&lt;br /&gt;L&amp;#39;ultima
opzione, di fianco ai tasti di conferma, permette di eseguire la
distinct sulle colonne selezionate, rimuovendo i duplicati in base alle
colonne scelte per l&amp;#39;ordinamento.&lt;br /&gt;&lt;br /&gt;Come la maggior parte dei task, anche il Sort ha un &amp;quot;Advanced Editor&amp;quot;, raggiungibile premendo il tasto destro sul componente.&lt;br /&gt;Qui troverete tutte le opzioni, comprese quelle che nei designer non vengono proposte.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Aggregate Transformation&lt;br /&gt;&lt;/span&gt;Il
task si occupa di aggregare i dati. Lo fa tramite funzioni di
aggregazione come la AVG, o la SUM, oppure tramite semplici GROUP BY di
dati. Può essere utilizzato in &lt;span style="font-style:italic;"&gt;Basic Mode&lt;/span&gt; oppure in &lt;span style="font-style:italic;"&gt;Advanced Mode&lt;/span&gt;.
Nel primo caso possiamo definire trasformazioni a livello di colonna.
Mentre nel secondo&amp;nbsp; è possibile definre regole per il controllo della
cache e delle prestazioni, nonchè la definizione di output multipli.&lt;br /&gt;L&amp;#39;aggregation
transformation è del tutto asincrono, quindi non esegue i
raggruppamenti row-by-row, ma prepara una parte di aggragazioni creando
le colonne in uscita, ragionando set based ed utilizzando una sua cache.&lt;br /&gt;&lt;br /&gt;Ecco come appare in Basic Mode:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://blogs.dotnethell.it/filestore/5948_aggregate.jpg" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;Quelle
nell&amp;#39;immagine sono tutte le funzioni di aggregazione possibili. Ma non
tutti i tipi dato possono disporre dell&amp;#39;intero insieme. Leggete &lt;a href="http://blogs.dotnethell.it/suxstellino/Aggregate-task-non-tutte-le-aggregazioni-sempre__5578.aspx" target="_blank"&gt;qui&lt;/a&gt;
per capire quali funzioni sono disponibili in base al tipo di dato.
Inoltre fate attenzione per alcuni tipi di dato numerici, dai BOL:&lt;br /&gt;&lt;br /&gt;&amp;quot;&lt;span style="font-style:italic;"&gt;A
column may contain numeric values that require special consideration
because of their large value or precision requirements. The Aggregation
transformation includes the IsBig property, which you can set on output
columns to invoke special handling of big or high-precision numbers. If
a column value may exceed 4 billion or a precision beyond a float data
type is required, IsBig should be set to 1.&lt;/span&gt;&lt;br style="font-style:italic;" /&gt;&lt;br style="font-style:italic;" /&gt;&lt;span style="font-style:italic;"&gt;Setting the IsBig property to 1 affects the output of the aggregation transformation in the following ways:&lt;/span&gt;&lt;br style="font-style:italic;" /&gt;&lt;span style="font-style:italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * The DT_R8 data type is used instead of the DT_R4 data type.&lt;/span&gt;&lt;br style="font-style:italic;" /&gt;&lt;span style="font-style:italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * Count results are stored as the DT_UI8 data type.&lt;/span&gt;&lt;br style="font-style:italic;" /&gt;&lt;span style="font-style:italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * Distinct count results are stored as the DT_UI4 data type.&lt;/span&gt;&lt;br style="font-style:italic;" /&gt;&lt;br style="font-style:italic;" /&gt;&lt;span style="font-style:italic;"&gt;Note:&lt;/span&gt;&lt;br style="font-style:italic;" /&gt;&lt;span style="font-style:italic;"&gt;You cannot set IsBig to 1 on columns that are used in the GROUP BY, Maximum, or Minimum operations.&lt;/span&gt;&amp;quot;&lt;br /&gt;&lt;br /&gt;Per impostare la Proprietà &lt;span style="font-style:italic;"&gt;IsBig&lt;/span&gt;
è necessario utilizzare l&amp;#39;advanced editor (tasto destro --&amp;gt; Advanced
editor, sul task) e spostarsi sul tab &amp;quot;Input And Output&amp;quot;. Selezionando
una delle colonne di output che interessa la modifica è possibile
impostare la proprietà.&lt;br /&gt;&lt;br /&gt;Nel basic mode quindi, è sufficiente
selezionare le colonne e definire la funzione di aggregazione. Avremo
un output con gli aggregati.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In Advanced Mode invece, abbiamo quanto segue:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://blogs.dotnethell.it/filestore/5950_aggregateadvanced.jpg" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;La
sezione superiore indica la possibilità di definire più output per la
trasformazione. Immaginiamo di voler tornare il numero dei dettagli per
utente in un resultset e la semplice group by degli utenti in un altro.
Con l&amp;#39;advanced mode è possibile creare resultset multipli definiti in
maniera differente.&lt;br /&gt;&lt;br /&gt;Spostandosi sul tab Advanced è possibile modificare le proprietà relative all&amp;#39;ottimizziazione delle performance. &lt;br /&gt;&lt;span style="font-style:italic;"&gt;Number of Keys&lt;/span&gt; consente di specificare il numero esatto di chiavi per la trasformazione.&lt;br /&gt;&lt;span style="font-style:italic;"&gt;KeysScale&lt;/span&gt; consente di specificare un numero di chiavi approssimativo. &lt;br /&gt;Valorizzando &lt;span style="font-style:italic;"&gt;Number of Keys&lt;/span&gt;, la trasformazione non riscrive i dati nella cache, permettendo un buon miglioramento delle prestazioni.&lt;br /&gt;Lo stesso discorso vale per le proprietà &lt;span style="font-style:italic;"&gt;CountDistinct &lt;/span&gt;solo che coinvolgono solamente le operazioni di quel tipo (COUNT DISTINCT).&lt;br /&gt;Infine vi è la proprietà &lt;span style="font-style:italic;"&gt;Auto Extend factor&lt;/span&gt;, che determina la percentuale del&amp;#39;estensione della memoria utilizzata durante le operazioni di aggregazione.&lt;br /&gt;&lt;br /&gt;Modificando
opportunamente questi valori (ovviamente in base a quanto si conosce
dell&amp;#39;operazione di aggregazione) è possibile gestire memoria e cache in
modo tale da migliorare le prestazioni a runtime.&lt;br /&gt;&lt;br /&gt;Abbiamo visto altri due task di trasformazione, nei prossimi post parleremo anche del precedentemente nominato Merge Join.&lt;br /&gt;&lt;br /&gt;Stay tuned! &lt;img src="http://blogs.dotnethell.it/icons/ThumbUp2.gif" alt="" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://community.ugiss.org/aggbug.aspx?PostID=3081" width="1" height="1"&gt;</content><author><name>sux_stellino</name><uri>http://community.ugiss.org/members/sux_5F00_stellino.aspx</uri></author><category term="SSIS tips" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SSIS+tips/default.aspx" /><category term="SSIS in generale" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SSIS+in+generale/default.aspx" /><category term="SQL Server 2005" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SQL+Server+2005/default.aspx" /><category term="SSIS" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SSIS/default.aspx" /></entry><entry><title>[SSIS 2008] Primi passi.. I miglioramenti del lookup transform</title><link rel="alternate" type="text/html" href="http://community.ugiss.org/blogs/sux_stellino/archive/2008/01/11/primi-passi-con-ssis-2008-i-miglioramenti-del-lookup-transform.aspx" /><id>http://community.ugiss.org/blogs/sux_stellino/archive/2008/01/11/primi-passi-con-ssis-2008-i-miglioramenti-del-lookup-transform.aspx</id><published>2008-01-11T10.09.00Z</published><updated>2008-01-11T10.09.00Z</updated><content type="html">Ho finalmente iniziato a guardare &lt;b&gt;SSIS 2008&lt;/b&gt;, anche se forse avrei già dovuto farlo da un po&amp;#39;..&lt;img src="http://blogs.dotnethell.it/icons/embaressed_smile.gif" alt="" /&gt;&lt;br /&gt;Spulciando tra i vari blogger del settore ho notato &lt;a href="http://blogs.conchango.com/jamiethomson/archive/2007/11/16/Katmai_3A00_-SSIS_3A00_-Lookup-component-gets-a-makeover.aspx" target="_blank"&gt;questo interessante post&lt;/a&gt; di &lt;a href="http://blogs.conchango.com/jamiethomson/" target="_blank"&gt;Jamie Thomson&lt;/a&gt; uno degli esperti nel settore.&lt;br /&gt;La
sua pubblicazione è una semplice overview che parla del famoso task
Lookup, del quale ho parlato più volte in alcuni post precedenti.&lt;br /&gt;Bisogna già conoscere il Lookup Transform della versione 2005, se volete dare una lookup &lt;img src="http://blogs.dotnethell.it/icons/HugeSmile.gif" alt="" /&gt; andate &lt;a href="http://blogs.dotnethell.it/suxstellino/SSIS-Il-lookup-task-vantaggi-svantaggi-ed-ottimizzazione.__11180.aspx"&gt;qui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Aveva
di sicuro alcuni vuoti da colmare, e, come detto nel messaggio di
Jamie, alcuni aspetti sono stati veramente migliorati in maniera
evidente.&lt;br /&gt;In breve, abbiamo una ristudiata e riscritta gestione della &lt;span style="font-weight:bold;"&gt;cache&lt;/span&gt;, utilizzata ora anche per sorgenti come file di testo, XML, Excel, e quant&amp;#39;altro.&lt;br /&gt;Poi, finalmente, abbiamo la gestione dei dati che non fanno &amp;quot;match&amp;quot; tramite  un nuovo apposito output chiamato &lt;span style="font-weight:bold;"&gt;Lookup No Match Output&lt;/span&gt;(ricordiamo
che con SSIS 2005 eravamo costretti a controllare l&amp;#39;error output per
controllare quali dati non rispettavano il match sulla tabella di
lookup).&lt;br /&gt;&lt;br /&gt;Vi invito a guardare il &lt;a href="http://blogs.conchango.com/jamiethomson/archive/2007/11/16/Katmai_3A00_-SSIS_3A00_-Lookup-component-gets-a-makeover.aspx" target="_blank"&gt;post di Jamie&lt;/a&gt;, è compreso anche un video interessante..&lt;br /&gt;&lt;br /&gt;Stay Tuned! &lt;img src="http://blogs.dotnethell.it/icons/ThumbUp2.gif" alt="" /&gt;&lt;img src="http://community.ugiss.org/aggbug.aspx?PostID=3018" width="1" height="1"&gt;</content><author><name>sux_stellino</name><uri>http://community.ugiss.org/members/sux_5F00_stellino.aspx</uri></author><category term="SSIS in generale" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SSIS+in+generale/default.aspx" /><category term="SSIS" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SSIS/default.aspx" /><category term="DataFlow" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/DataFlow/default.aspx" /><category term="SQL Server 2008" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SQL+Server+2008/default.aspx" /><category term="Katmai" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/Katmai/default.aspx" /></entry><entry><title>[OT] - Auguri di Buone Feste</title><link rel="alternate" type="text/html" href="http://community.ugiss.org/blogs/sux_stellino/archive/2007/12/23/ot-auguri-di-buone-feste.aspx" /><id>http://community.ugiss.org/blogs/sux_stellino/archive/2007/12/23/ot-auguri-di-buone-feste.aspx</id><published>2007-12-23T12.07.00Z</published><updated>2007-12-23T12.07.00Z</updated><content type="html">&lt;p&gt;Auguri di Buon Natale e Felice Anno nuovo a tutti!&lt;br /&gt;
e come sempre..&lt;br /&gt;
Stay Tuned! &lt;img src="http://blogs.dotnethell.it/icons/ThumbUp2.gif" alt="" /&gt; &lt;br /&gt;&lt;/p&gt;&lt;img src="http://community.ugiss.org/aggbug.aspx?PostID=2888" width="1" height="1"&gt;</content><author><name>sux_stellino</name><uri>http://community.ugiss.org/members/sux_5F00_stellino.aspx</uri></author></entry><entry><title>[SSIS] - Il bypass del Web Service Task con uno script task</title><link rel="alternate" type="text/html" href="http://community.ugiss.org/blogs/sux_stellino/archive/2007/12/19/ssis-il-bypass-del-web-service-task-con-uno-script-task.aspx" /><id>http://community.ugiss.org/blogs/sux_stellino/archive/2007/12/19/ssis-il-bypass-del-web-service-task-con-uno-script-task.aspx</id><published>2007-12-19T18.25.00Z</published><updated>2007-12-19T18.25.00Z</updated><content type="html">&lt;p&gt;&amp;nbsp;Con SQL Server Integration Services è possibile utilizzare un
particolare task, chiamato Web service Task, utilizzato proprio per
invocare Web services. E&amp;#39; il seguente:&lt;br /&gt;&lt;img src="http://blogs.dotnethell.it/filestore/5788_wstask.png" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;Prendiamo un semplicissimo scenario, il web service di default che
Visual Studio 2005 ci propone quando creiamo un progetto Web Service.
Il classico Hello World.&lt;br /&gt;L&amp;#39;utilizzo del task è molto semplice. Gli step da seguire per poter usufruire delle sue funzionalità sono i seguenti:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Creare un connection Manager di tipo HTTP&lt;/span&gt;&lt;br /&gt;&lt;img src="http://blogs.dotnethell.it/filestore/5789_httpcon.png" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;Nell&amp;#39;esempio ho impostato semplicemente il link http al mio &lt;span style="font-weight:bold;"&gt;WSDL &lt;/span&gt;di prova, ma come potete notare ci sono altre impostazioni molto importanti da poter utilizzare.&lt;br /&gt;Ad
esempio è possibile fornire username, password e dominio di accesso,
impostare un certificato, definire il timeout, la dimensione del blocco
per la scrittura dei dati e testare la connessione.&lt;br /&gt;In alto vi è anche la clip dedicata alle impostazioni di un eventuale proxy.&lt;br /&gt;Siccome
questa connessione HTTP è stata appositamente creata per un web service
task e siccome avrò bisogno di conoscere la struttura del servizio, e
quindi un WSDL, l&amp;#39;url di riferimento comprende il parametro &lt;span style="font-weight:bold;"&gt;?WSDL&lt;/span&gt;. Chiamiamolo &lt;span style="font-style:italic;"&gt;Servizio&lt;/span&gt;&lt;br /&gt;&lt;br style="font-weight:bold;" /&gt;&lt;span style="font-weight:bold;"&gt;- Creare una variabile che conterrà la risposta (o un connection manager File per scrivere la risposta su filesystem)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;E&amp;#39; possibile ad esempio creare una variabile di tipo stringa che conterrà la risposta del nostro servizio.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://blogs.dotnethell.it/filestore/5790_var.png" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Creare nella cartella del nostro progetto o su di una posizione nel disco ben definita un file vuoto con estensione .wsdl&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://blogs.dotnethell.it/filestore/5791_wsdl.png" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Impostare il Web Service Task come segue:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Fare doppio click sul Web service Task.&lt;br /&gt;Come prima cosa selezionare la http connection che abbiamo creato pocanzi e poi definire nella proprietà &lt;span style="font-style:italic;"&gt;WSDLFile &lt;/span&gt;il percorso ove il file .wsdl è stato creato.&lt;br /&gt;La terza proprietà, &lt;span style="font-style:italic;"&gt;OverwriteWSDLFile&lt;/span&gt;, indica se si vuole sovrascrivere il file alla pressione del tasto sottostante, il &lt;span style="font-style:italic;"&gt;Download WSDL&lt;/span&gt;.&lt;br /&gt;La
prima volta, ed ogni volta che la struttura del servizio cambia (e
quindi ogni volta che si vuole scaricare il nuovo WSDL) lasciare questa
proprietà impostata a &lt;span style="font-style:italic;"&gt;True&lt;/span&gt;.&lt;br /&gt;A questo punto, premere il tasto &lt;span style="font-weight:bold;"&gt;Download WSDL&lt;/span&gt; e attendere il messaggio di conferma:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://blogs.dotnethell.it/filestore/5792_okmex.png" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;Se la proprietà OverwriteWSDLFile è a &lt;span style="font-style:italic;"&gt;False&lt;/span&gt;, viene restituito un messaggio di errore.&lt;br /&gt;Facoltativamente,
potete andare a controllare sul disco e noterete che il file scaricato
è effettivamente il WSDL del servizio che dobbiamo invocare.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Definire la sezione Input&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Spostarsi sulla sezione input. Scegliere il servizio (proprietà &lt;span style="font-style:italic;"&gt;Service&lt;/span&gt;) ed il metodo da eseguire (proprietà &lt;span style="font-style:italic;"&gt;Method&lt;/span&gt;).
Nel caso in cui il metodo abbia parametri, comparirà un&amp;#39;apposita
sezione al di sotto della selezione della chiamata. Qui di seguito un
esempio di chiamata con un parametro stringa (metodo Message), mentre
quello al precedente punto non ne ha alcuno:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://blogs.dotnethell.it/filestore/5793_inputparam.png" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;Attenzione,
perchè per i tipi che non sono considerati primitivi, come possono
esserlo interi e stringhe, SSIS non è in grado di fornire il passaggio
di parametri. Ad esempio, un metodo definito come il seguente, non
restituirà a SSIS nessuna richiesta di parametri input:&lt;br /&gt;&lt;br /&gt;







&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;lt;WebMethod()&amp;gt; _&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;
NumeroRighe(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; ds &lt;span style="color:blue;"&gt;As&lt;/span&gt;
DataSet) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;Return&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;
ds.Tables(0).Rows.Count&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Definire la sezione Output&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Dopo
aver configurato l&amp;#39;input, definiamo l&amp;#39;output selezionando il tipo di
container della risposta, File o Variabile. Qui di seguito l&amp;#39;esempio su
variabile, dichiarata all&amp;#39;inizio del post:&lt;br /&gt;&lt;img src="http://blogs.dotnethell.it/filestore/5794_output.png" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;Eseguendo
un ipotetico SSIS che lancia il web service suddetto e che in seguito
visualizza il valore della risposta avremo questo comportamento:&lt;br /&gt;&lt;img src="http://blogs.dotnethell.it/filestore/5795_end.png" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;Dopo
aver introdotto il task, vorrei soffermarmi su alcuni ostacoli che
potremmo incontrare nell&amp;#39;usarlo. E vorrei anche giustificare il titolo
del post &lt;img src="http://blogs.dotnethell.it/icons/regular_smile.gif" alt="" /&gt;.&lt;br /&gt;Oltre a non poter passare parametri di un certo tipo (da MSDN: &amp;quot;&lt;span style="font-style:italic;"&gt;The Web Service task supports parameters of the following data types
only: primitive types such as integers and strings; arrays and
sequences of primitive types; and enumerations.&lt;/span&gt;&amp;quot;),
vi è da ricordare che tutte le risposte del web service task sono
stringhe. Ognuna di esse è la serializzazione del valore/oggetto di
ritorno. Quindi ogni stringa contiene l&amp;#39;XML della risposta
serializzata. Questo perchè il task non si pone di creare una classe
proxy come ad esempio Visual Studio fa quando aggiungiamo una Web
Reference.&lt;br /&gt;Abbiamo la possibilità di salvare la stringa su un file
xml, è vero, ma se volessimo utilizzare la risposta tipizzandola e
castandola in un nostro oggetto all&amp;#39;interno di un package, dovremmo per
forza ricorrere alla deserializzazione. E quindi scrivere codice. &lt;br /&gt;Di conseguenza, molto spesso non utilizzo il web service task ma direttamente lo script task, in un modo un po&amp;#39; particolare.&lt;br /&gt;&lt;br /&gt;Tramite il tool WSDL.exe usato anche da Visual studio per scrivere la classe proxy dal wsdl, genero la classe proxy.&lt;br /&gt;&lt;img src="http://blogs.dotnethell.it/filestore/5796_cmd.png" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;Aggiungo
uno script task e includo al suo interno la classe generata con
wsdl.exe (con SSIS 2005 solo VB). Inoltre aggiungo il riferimento a &lt;span style="font-style:italic;"&gt;System.Web.Services &lt;/span&gt;e &lt;span style="font-style:italic;"&gt;System.Xml&lt;/span&gt;.&lt;br /&gt;&lt;img src="http://blogs.dotnethell.it/filestore/5798_wsscript.png" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Nello
ScriptMain possiamo istanziare il manager del servizio (la nostra
classe proxy) per eseguire i metodi da codice. Ricordiamo il metodo
d&amp;#39;esempio:&lt;br /&gt;&lt;br /&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;lt;WebMethod()&amp;gt; _&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;
NumeroRighe(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; ds &lt;span style="color:blue;"&gt;As&lt;/span&gt;
DataSet) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;Return&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;
ds.Tables(0).Rows.Count&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-style:italic;"&gt;&lt;/span&gt;Ecco come nello Script eseguo la chiamata:&lt;br /&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;Imports&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; System&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;Imports&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; System.Data&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;Imports&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; System.Math&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;Imports&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; Microsoft.SqlServer.Dts.Runtime &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;Public&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt; ScriptMain&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;



&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; Main()&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;







&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:green;"&gt;&amp;#39; istanzio il web service&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; objWS &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; Service1() &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;



&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:green;"&gt;&amp;#39; creo una tabella con una riga&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;Dim&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; objdt &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; DataTable()&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;





&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;objdt.Columns.Add(&lt;span&gt;&amp;quot;col1&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;GetType&lt;/span&gt;(System.String))&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; objdr &lt;span style="color:blue;"&gt;As&lt;/span&gt; DataRow
= objdt.NewRow()&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;







&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;objdr(&lt;span&gt;&amp;quot;col1&amp;quot;&lt;/span&gt;) = &lt;span&gt;&amp;quot;PROVA&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;objdt.Rows.Add(objdr) &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;







&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:green;"&gt;&amp;#39; popolo il dataset&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; objDs &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; DataSet&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;objDs.Tables.Add(objdt)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;





&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:green;"&gt;&amp;#39; chiamo il metodo che mi torna il numero di righe della tabella del
dataset&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;Dim&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; i &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt; =
objWS.NumeroRighe(objDs)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;



&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:green;"&gt;&amp;#39; ...&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:green;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;Dts.TaskResult = Dts.Results.Success&lt;/span&gt;&lt;/p&gt;



&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;End&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;End&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
Con questo metodo possiamo muoverci con maggiore libertà sui tipi del
framework ed anche su quelli definiti da noi. Esiste comunque un
rovescio della medaglia, ed è quello relativo alla manutenzione del
codice. Cambiando la struttura del web service, è necessario replicare
la nuova classe proxy anche negli script che la utilizzano.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;ATTENZIONE&lt;/span&gt;&lt;br /&gt;Vi è una soluzione più &lt;span style="font-weight:bold;"&gt;corretta&lt;/span&gt;, ovvero &lt;span style="font-weight:bold;"&gt;creare una dll strongly signed e metterla in GAC&lt;/span&gt;,
in modo tale da poter aggiungere il riferimento così come per le altre
classi .NET. Quest&amp;#39;ultima è sicuramente la soluzione più pulita, se non
vogliamo utilizzare il task di SSIS. Ad ogni modo, il riferimento deve
essere aggiunto a livello di Script poichè non è possiible referenziare
una DLL a livello globale. &lt;br /&gt;Comunque lascio la firma e la creazione dell&amp;#39;assembly in GAC a Voi.. ecco un link utile per capire meglio come firmare la dll &lt;br /&gt;http://msdn2.microsoft.com/en-us/library/ms247123.aspx&lt;br /&gt;&lt;br /&gt;Stay tuned! &lt;img src="http://blogs.dotnethell.it/icons/ThumbUp2.gif" alt="" /&gt;&lt;br /&gt;&lt;img src="http://community.ugiss.org/aggbug.aspx?PostID=2874" width="1" height="1"&gt;</content><author><name>sux_stellino</name><uri>http://community.ugiss.org/members/sux_5F00_stellino.aspx</uri></author><category term="SSIS tips" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SSIS+tips/default.aspx" /><category term="SSIS in generale" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SSIS+in+generale/default.aspx" /><category term="SQL Server 2005" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SQL+Server+2005/default.aspx" /><category term="SSIS" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SSIS/default.aspx" /></entry><entry><title>[SSIS] - I DataFlow - le trasformazioni</title><link rel="alternate" type="text/html" href="http://community.ugiss.org/blogs/sux_stellino/archive/2007/12/01/ssis-i-dataflow-le-trasformazioni.aspx" /><id>http://community.ugiss.org/blogs/sux_stellino/archive/2007/12/01/ssis-i-dataflow-le-trasformazioni.aspx</id><published>2007-12-01T02.32.00Z</published><updated>2007-12-01T02.32.00Z</updated><content type="html">Ritorniamo alla nostra allungatissima lezione introduttiva su SSIS &lt;img src="http://blogs.dotnethell.it/icons/regular_smile.gif" alt="" /&gt;,
anche se alcuni di voi ormai avranno raggiunto uno skill talmente
elevato da non dover nemmeno considerare questa pagina. Ma è il mio
progetto iniziale e quindi lo porto a termine, cercando di coprire un
po&amp;#39; tutti gli argomenti su Integration Service, perlomento quelli
basilari &lt;img src="http://blogs.dotnethell.it/icons/regular_smile.gif" alt="" /&gt;.&lt;br /&gt;L&amp;#39;&lt;a href="http://blogs.dotnethell.it/suxstellino/I-DataFlow-Le-destinazioni__11815.aspx"&gt;ultima volta &lt;/a&gt;ci eravamo fermati alle &lt;a href="http://blogs.dotnethell.it/suxstellino/I-DataFlow-Le-destinazioni__11815.aspx"&gt;destinazioni dei DataFlow&lt;/a&gt;. In questo post cominceremo ad affrontare l&amp;#39;argomento più vario della sezione relativa al flusso dati, le &lt;span style="font-weight:bold;"&gt;Trasformazioni&lt;/span&gt;.&lt;br /&gt;Cosa
sono? Generalizzando al massimo, mentre le sorgenti sono veri e propri
&amp;quot;generatori&amp;quot; di dati e le destinazioni i &amp;quot;contenitori&amp;quot;, tutto quello
che sta nel mezzo è una trasformazione. Un dataflow può essere formato
anche da una o più sorgenti che mappano una o più destinazioni
solamente, ma in logiche complesse, i task di trasformazione sono
necessari per portare le informazioni dallo stato A in cui si trovano
alla sorgente, verso lo stato B necessario alla destinazione. Nella
sigla &lt;a href="http://en.wikipedia.org/wiki/Extract,_transform,_load"&gt;ETL&lt;/a&gt;, di cui SSIS rappresenta una delle implementazioni, le trasformazioni sono proprio la T (Extract, Transform and Load).&lt;br /&gt;Per fare semplici esempi, pensate ad alcuni dati che arrivano denormalizzati su txt (in post precedenti, nella sezione &lt;a href="http://blogs.dotnethell.it/suxstellino/Category_791.aspx"&gt;SSIS Tips&lt;/a&gt;
abbiamo avuto modo di vedere già alcuni Dataflow con trasformazioni) e
che devono essere portati su strutture più &amp;quot;normali&amp;quot; su sql server,
access, excel. O viceversa, dati provenienti da vari &lt;a href="http://it.wikipedia.org/wiki/RDBMS"&gt;RDBMS&lt;/a&gt; che necessitano di essere scaricati su file flat, csv, xml, altre piattaforme.. e via discorrendo.&lt;br /&gt;&lt;br /&gt;Le trasformazioni possono essere suddivise in quattro macrocategorie:&lt;br /&gt;&lt;br style="font-weight:bold;" /&gt;&lt;span style="font-weight:bold;"&gt;- Business Intelligence Transformations&lt;/span&gt;&lt;br style="font-weight:bold;" /&gt;&lt;span style="font-weight:normal;"&gt;&amp;nbsp; Permettono di implementare logiche di business sui dati (ad esempio
calcoli di Data Minig).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;- Row Transformations&lt;br /&gt;&lt;/span&gt;&amp;nbsp;
Consentono la creazione e l&amp;#39;aggiornamento di colonne in base alla riga
passata in input al task (ad esempio Colonne derivate, Script
component, Conversioni di date, Comandi OLEDB per riga)&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;&lt;br style="font-weight:bold;" /&gt;&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;- Rowset Transformations&lt;/span&gt;&lt;br style="font-weight:bold;" /&gt;&amp;nbsp;
Consentono la creazione di set di dati aggregati, ordinati, trasposti
(ad esempio il PIVOT/UNPIVOT, i task di raggruppamento, il task sort)&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;- Split and Join Transformations&lt;/span&gt;&lt;br style="font-weight:bold;" /&gt;&amp;nbsp;
Consentono la distribuzione di un input in più output, l&amp;#39;unione di più
input in un output oppure eseguono operazioni di lookup (multicast,
union e lookup task)&lt;br /&gt;&lt;br /&gt;Tutte le trasformazioni che non rientrano
in questi quattro gruppi (ad esempio i RowCount, le Slowly Changing
Dimension, ecc) sono stati categorizzati da Microsoft come &lt;span style="font-weight:bold;"&gt;Other Transformations&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Ho
deciso di saltare il primo gruppo, quello legato alla BI, soprattutto
per frequenza di utilizzo nella maggior parte delle applicazioni in cui
i SSIS vengono applicati. Vi lascio comunque la reference su MSDN
qualora doveste averne bisogno. L&amp;#39;elenco dei task relativo a questa
sezione è:&lt;br /&gt;- &lt;a href="http://msdn2.microsoft.com/en-us/library/ms141764.aspx"&gt;Fuzzy Grouping&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://msdn2.microsoft.com/en-us/library/ms137786.aspx"&gt;Fuzzy Lookup&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://msdn2.microsoft.com/en-us/library/ms141809.aspx"&gt;Term Extraction&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://msdn2.microsoft.com/en-us/library/ms137850.aspx"&gt;Term Lookup&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://msdn2.microsoft.com/en-us/library/ms140358.aspx"&gt;Data Mining Query&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Passiamo quindi alle &lt;span style="font-weight:bold;"&gt;Row transformations&lt;/span&gt;. L&amp;#39;elenco è il eguente e anche in questo caso lascio il link ad MSDN:&lt;br /&gt;- &lt;a href="http://msdn2.microsoft.com/en-us/library/ms141694.aspx"&gt;Character Map Transformation&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://msdn2.microsoft.com/en-us/library/ms137741.aspx"&gt;Copy Column Transformation&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://msdn2.microsoft.com/en-us/library/ms141706.aspx"&gt;Data Conversion Transformation&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://msdn2.microsoft.com/en-us/library/ms141069.aspx"&gt;Derived Column Transformation&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://msdn2.microsoft.com/en-us/library/ms137640.aspx"&gt;Script Component&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://msdn2.microsoft.com/en-us/library/ms141138.aspx"&gt;OLE DB Command Transformation&lt;/a&gt; &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&lt;/span&gt;&lt;br /&gt;Le tre maggiormente utilizzate nella mia esperienza da SSIS developer &lt;img src="http://blogs.dotnethell.it/icons/regular_smile.gif" alt="" /&gt; sono state la&lt;span style="font-style:italic;"&gt; Derived Column&lt;/span&gt;, la&lt;span style="font-style:italic;"&gt; Data Conversion &lt;/span&gt;e lo &lt;span style="font-style:italic;"&gt;Script component&lt;/span&gt;.&lt;br /&gt;Con la prima è infatti molto semplice modificare i metadati provenienti da una sorgente. Grazie a&lt;span style="font-style:italic;"&gt; Derived Column&lt;/span&gt;
infatti è possibile aggiungere colonne, indicando un nuovo nome ed una
espressione che riassume il valore che conterrà quel particolare campo.
&lt;br /&gt;Facciamo un esempio. Supponiamo di avere una sorgente dati che ci
passa un campo particolare, che deve essere sia elaborato, sia tenuto
com&amp;#39;era in origine. Ad esempio, l&amp;#39;età di una persona e la sua età fra
20 anni (esempio semplificato al massimo, non è necessario un SSIS per
questo &amp;quot;problema&amp;quot; &lt;img src="http://blogs.dotnethell.it/icons/HugeSmile.gif" alt="" /&gt;).&lt;br /&gt;In
questo contesto possiamo creare una colonna Eta20, derivandola da Eta
ed aggiungendo un&amp;#39;espressione data dalla colonna Eta + 20:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.dotnethell.it/filestore/5688_derived1.png"&gt;&lt;img src="http://blogs.dotnethell.it/filestore/5688_derived1.png" width="500" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;
			&lt;div id="ctl00_rs1_mainContentContainer_cpe70435_h" class="CollapseRegionLink"&gt;
Possiamo notare come è semplice creare la colonna derivata, trascinando
la colonna in input verso la sezione sottostante per creare la riga su
cui fare il calcolo. La prima informazione da inserire è il nome della
nuova colonna, il tipo di operazione, l&amp;#39;espressione ed il tipo di dato
con le eventuali informazioni aggiuntive sul tipo stesso.&lt;br /&gt;Come
tipo di operazione (seconda colonna, Derived Column) è possibile
aggiungere una o più nuove colonne, e allora si procede come
nell&amp;#39;esempio, oppure sovrascriverne il contenuto. In questo caso
l&amp;#39;esempio cambia leggermente. Il nome non è editabile, poichè rimane lo
stesso della colonna sorgente, e il tipo di dato dell&amp;#39;espressione deve
obbligatoriamente ritornare il tipo della colonna sorgente stessa. Alla
fine dell&amp;#39;operazione avremo in output del task un numero di metadati in
più tante quante sono le operazioni di &amp;lt;add as new column&amp;gt;.&lt;br /&gt;E&amp;#39; possibile notarlo con un semplice doppio click sui constraints (le frecce):&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.dotnethell.it/filestore/5689_metad.png"&gt;&lt;img src="http://blogs.dotnethell.it/filestore/5689_metad.png" width="500" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;E&amp;#39; possibile inserire infatti più colonne derivate (nell&amp;#39;esempio solo una), anche solo per convertire il dato.&lt;br /&gt;Tuttavia è consigliabile utilizzare l&amp;#39;altro task progettato proprio per le conversioni, il &lt;span style="font-style:italic;"&gt;Data Conversion&lt;/span&gt;.
Anche questa trasformazione, riceve in input una row e processa i
metadati, trasformandoli in nuovi metadati, agendo però solamente sul
tipo di dato. Continuiamo col nostro dataflow. Immaginiamo di voler
convertire il campo Eta20 da intero a 1byte (DT_I1) verso una stringa:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.dotnethell.it/filestore/5690_dataconv.png"&gt;&lt;img src="http://blogs.dotnethell.it/filestore/5690_dataconv.png" width="500" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br style="font-style:italic;" /&gt;
			&lt;/div&gt;Si
seleziona la colonna e si definisce la conversione. In questo caso,
parto dalla colonna Eta20 e arrivo ad una nuova colonna strEta20, di
tipo stringa con CodePage 1252 (ANSI Latin) e lunghezza 3 caratteri.
Come per la derived column possiamo controllare l&amp;#39;input del task e
l&amp;#39;output. Nel nostro caso in input ci sono le tre colonne di output del
derived column task ed in output c&amp;#39;è la colonna strEta20 in più.&lt;br /&gt;&lt;br /&gt;Seppure
la trasformazione Copy Column sia comunque utilizzata, preferisco
saltarla; noterete come si avvicina alla Data Conversion (molto più
semplice di quest&amp;#39;ultima). Anche la OLEDB Command, che si discosta però
da tutte le trasformazioni che stiamo affrontando, non verrà trattata
in questo post. E&amp;#39; sufficiente sapere che esegue il comando riga per
riga. Quindi prende la riga in input ed esegue un comando SQL.
Attenzione a non abusarne, proprio per la sua logica ciclica. Mi è
capitato di utilizzarla per gestire alcuni lookup errati, in modo da
salvarli all&amp;#39;interno di tabelle di log. Può risultare utile anche per
&amp;quot;appoggiare&amp;quot; i dati non validi al momento su di una tabella che viene
controllata periodicamente al fine di cercare di ripristinare eventuali
record.&lt;br /&gt;Comunque sia vi ho consiglio di leggere la reference su MSDN.&lt;br /&gt;&lt;br /&gt;Terminiamo
in vece con la trasformazione più particolare, proprio perchè potrebbe
anche non essere una vera e propria trasformazione. Lo &lt;span style="font-style:italic;"&gt;Script Component&lt;/span&gt;.
Ogni qual volta esso viene trascinato sullo stage la prima richiesta è
&amp;quot;come deve comportarsi?&amp;quot; e le possibili risposte sono &amp;quot;sorgente&amp;quot;,
&amp;quot;destinazione&amp;quot;, &amp;quot;trasformazione&amp;quot;. Il caso che ci interessa è proprio
quest&amp;#39;ultimo.&lt;br /&gt;Partiamo dal presupposto che anche questo task si
comporta come le transformation di cui abbiamo parlato; ha un input
(che porta con se metadati) e un output.&lt;br /&gt;Quello che trasforma è la
logica dello script, quindi quello che andiamo a scrivere noi. Si
utilizza quando altri task non soddisfano le nostre richieste, ma come
ho già detto &lt;a href="http://blogs.dotnethell.it/suxstellino/Split-File-Flat-personalizzato__9551.aspx"&gt;qui&lt;/a&gt; e &lt;a href="http://blogs.dotnethell.it/suxstellino/Data-Flow-bypass-dellXML-Source__8592.aspx"&gt;qui&lt;/a&gt;, può essere comodo anche per bypassare degli scomodi comportamenti di altri componenti.&lt;br /&gt;&lt;br /&gt;Supponiamo,
per comodità, di dover ripetere le funzioni definite dai due precedenti
task. Partiamo da una tabella che ha il campo Eta e vogliamo arrivare a
strEta20. Con lo script, come prima cosa si sceglie la natura del
component:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://blogs.dotnethell.it/filestore/5691_script1.png" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;Successivamente si selezionano gli input, ovvero i metadati derivandi dal task precedente:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.dotnethell.it/filestore/5692_script2.png"&gt;&lt;img src="http://blogs.dotnethell.it/filestore/5692_script2.png" width="500" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Da
notare la colonna UsageType che determina se le colonne possono essere
anche scritte, oltre che lette. La fase seguente consiste nel preparare
l&amp;#39;output:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.dotnethell.it/filestore/5693_script3.png"&gt;&lt;img src="http://blogs.dotnethell.it/filestore/5693_script3.png" width="500" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Si
rinomina l&amp;#39;output (operazione facoltativa) poi si aggiungono tante
colonne quante si vogliono aggiungere in output del task ed infine si
definiscono i rispettivi parametri (tipo di dato, lunghezza, codepage,
precisione, scala, ecc..). Infine si progetta lo script:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.dotnethell.it/filestore/5696_script4.png"&gt;&lt;img src="http://blogs.dotnethell.it/filestore/5696_script4.png" width="500" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://blogs.dotnethell.it/filestore/5697_script4b.png"&gt;&lt;img src="http://blogs.dotnethell.it/filestore/5697_script4b.png" width="500" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Il
metodo già proposto da SSIS è Input0_ProcessInputRow tramite il quale è
possibile usare l&amp;#39;oggetto Row, passato come parametro, come se fosse la
riga corrente. Ed è proprio in questo metodo che ho scritto la somma e
la conversione. Vi sono poi altri metodi su cui è possibile agire:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.dotnethell.it/filestore/5695_script5.png"&gt;&lt;img src="http://blogs.dotnethell.it/filestore/5695_script5.png" width="500" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Per questi leggete questo &lt;a href="http://msdn2.microsoft.com/en-us/library/microsoft.sqlserver.dts.pipeline.scriptcomponent_methods.aspx"&gt;link&lt;/a&gt; relativo ai metodi dello script component.&lt;br /&gt;&lt;br /&gt;Mi
fermo qui nell&amp;#39;introdurre le trasformazioni. Dobbiamo affrontare ancora
due gruppi, e nei prossimi post vedremo come comportarci con le
possibilità che Integration Services ci fornisce.&lt;br /&gt;Vedendo una prima
carrellata, è normale pensare che lo script potrebbe risolvere molti
dei vostri problemi, comunque sia, vi consiglio di capire e conoscere
bene gli strumenti e le altre funzionalità che il resto dei task
possono darvi. Questo per comprendere se il codice scritto da voi (noi,
mi ci metto anche io &lt;img src="http://blogs.dotnethell.it/icons/tounge_smile.gif" alt="" /&gt;)&amp;nbsp; può darvi veramente dei vantaggi.&lt;br /&gt;Ricordatevi
che l&amp;#39;architettura di SSIS è ottimizzata ed è in grado di
parallelizzare le operazioni (nonchè gestire la memoria in maniera
molto intelligente). Quindi fate prima attenzione a tutto quello che
potete provare prima di arrivare a scrivere &amp;quot;vagonate&amp;quot; di codice.&lt;br /&gt;&lt;br /&gt;Stay tuned! &lt;img src="http://blogs.dotnethell.it/icons/ThumbUp2.gif" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://community.ugiss.org/aggbug.aspx?PostID=2747" width="1" height="1"&gt;</content><author><name>sux_stellino</name><uri>http://community.ugiss.org/members/sux_5F00_stellino.aspx</uri></author><category term="SSIS tips" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SSIS+tips/default.aspx" /><category term="SSIS in generale" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SSIS+in+generale/default.aspx" /><category term="SSIS" scheme="http://community.ugiss.org/blogs/sux_stellino/archive/tags/SSIS/default.aspx" /></entry><entry><title>[SQL Server 2008] - Declarative Management Framework</title><link rel="alternate" type="text/html" href="http://community.ugiss.org/blogs/sux_stellino/archive/2007/11/24/sql-server-2008-declarative-management-framework.aspx" /><id>http://community.ugiss.org/blogs/sux_stellino/archive/2007/11/24/sql-server-2008-declarative-management-framework.aspx</id><published>2007-11-24T15.17.00Z</published><updated>2007-11-24T15.17.00Z</updated><content type="html">&lt;p&gt;Qualche giorno fa ho seguito il blog di &lt;a href="http://blogs.ugidotnet.org/ghotz/Default.aspx" target="_blank"&gt;Gianluca Hotz&lt;/a&gt; sul Declarative Management Framework, una nuova interessantissima feature di &lt;a href="http://www.microsoft.com/sql/2008/default.mspx" target="_blank"&gt;SQL Server 2008&lt;/a&gt;. &lt;br /&gt;
Devo dire che l&amp;#39;ho trovata proprio una funzionalità potente e molto
interessante. Tramite DMF è possibile infatti definire svariate
policies relative alle opzioni del server, a quelle del database e a
tutto ciò che può essere definito nell&amp;#39;amministrazione di un database
server in generale.&lt;br /&gt;
Un tipo di policy a mio avviso molto importante per alcuni aspetti è
quello che consente di stabilire le regole relative alla naming
convention degli oggetti database. E&amp;#39; possibile definire ben definiti
vincoli sull&amp;#39;utilizzo dei normi degli oggetti che andiamo a creare.&lt;br /&gt;
&lt;br /&gt;
Prendendo l&amp;#39;esempio dell&amp;#39;azienda in cui lavoro, tutti si possono
riferire ad un documento in cui sono specificate le linee guida per la
creazione delle tabelle, foreign key, programmabilità, ecc.&lt;br /&gt;
Ma non risulta troppo comodo, poichè è necessario sempre rileggere la
parte del documento interessata ogni qual volta andiamo ad operare sul
nostro db.. Prima o poi i concetti entrano in testa e il doc non serve
più &lt;img src="http://blogs.dotnethell.it/icons/regular_smile.gif" alt="" /&gt; ma
rimane sempre la possibilità che chi va a creare oggetti possa
sbagliarsi anche senza accorgersene.. Quindi il doc fornisce sì le
linee guida, ma non controlla.&lt;br /&gt;
DMF, con la policy sulle naming, serve proprio in questo punto.
Soprattutto per chi, come me, ha dovuto implementare una logica di DDL
trigger a manina per controllare il nome di ogni oggetto.&lt;br /&gt;
A prescindere dal fatto che comunque le policies di questo tipo
utilizzino comunque dei trigger DDL, credo che utilizzare la nuova
feature di SQL Server 2008 per la naming convention sia più veloce e
decisamente importante per il database development.&lt;br /&gt;
&lt;br /&gt;
Innanzitutto per la &lt;span style="font-weight:bold;"&gt;leggibilità &lt;/span&gt;del
codice. Lavorando in gruppo e seguendo le regole, tutti sapranno sempre
scrivere codice comprensibile per tutti. Comprensibile anche dopo tanto
tempo che non lo si guarda più, poichè anche se la policy si riferisce
all&amp;#39;oggetto nello specifico, indirettamente mantiene più vicino quanto
scritto agli standard aziendali.&lt;br /&gt;
&lt;br /&gt;
E DMF ci sonsente di creare, a mio modo di vedere, proprio la definizione di &lt;span style="font-weight:bold;"&gt;standard di sviluppo &lt;/span&gt;aziendali. Risulta molto comodo definire un template di regole da seguire, &lt;span style="font-weight:bold;"&gt;esportarlo in XML&lt;/span&gt; e poi riutilizzarlo identico su di un altro server o in altri contesti. &lt;br /&gt;
&lt;br /&gt;
E per ultima cosa, ma non per importanza, riusciamo ad ottenere un vero e proprio &lt;span style="font-weight:bold;"&gt;ordine&lt;/span&gt;
una sorta di schema controllato e organizzato. Questo ci permette di
avere chiarezza, o meglio, di capire sempre di quali oggetti si sta
parlando. E&amp;#39; molto utile sapere che un tipo oggetto si chiamerà sempre
con un nome relativo ad un particolare template. Anche per avere un
database &amp;quot;parlante&amp;quot; e &amp;quot;pulito&amp;quot; a livello di modellazione.&lt;br /&gt;
&lt;br /&gt;
Sia chiaro, sono cose che il buonsenso di ogni DBA o DBDeveloper (o
sviluppatore in generale) hanno già creato. Non è una novità darsi
delle regole di sviluppo. La novità è proprio lo strumento che ci
permette di crearle e controllarle in automatico, senza dover dire &amp;quot;&lt;span style="font-style:italic;"&gt;ma chi ha fatto temp1?&lt;/span&gt;&amp;quot;, oppure &amp;quot;&lt;span style="font-style:italic;"&gt;ma prova2 è una vista o una tabella?&lt;/span&gt;&amp;quot; &lt;img src="http://blogs.dotnethell.it/icons/HugeSmile.gif" alt="" /&gt;. Ora, queste sono estremizzazioni, ma credo che qualcuno abbia già affrontato problemi simili &lt;img src="http://blogs.dotnethell.it/icons/wink_smile.gif" alt="" /&gt;..&lt;br /&gt;
Quante volte si sentono persone che dicono &amp;quot;&lt;span style="font-style:italic;"&gt;creo una tabella di appoggio e la chiamo appo&lt;/span&gt;&amp;quot;?
Beh, ora, per evitare che queste cose si ripetano, DMF impedirà la
creazione dell&amp;#39;oggetto e darà un messaggio di ritorno come &amp;quot;&lt;span style="font-style:italic;"&gt;Ok, falla pure, ma non qui&lt;/span&gt;&amp;quot; &lt;img src="http://blogs.dotnethell.it/icons/HugeSmile.gif" alt="" /&gt;.&lt;br /&gt;
&lt;br /&gt;
A parte gli scherzi con questo tipo di policy, a mio modesto parere,
avremo tanti vantaggi. Certo, qualcuno storcerà il naso perchè non si
sentirà più liberissimo. Ma tutto va a favore dello sviluppo.&lt;br /&gt;
&lt;br /&gt;
Pensate che questa è solo una piccola parte delle policies che si
possono configurare. Ce ne sono tantissime e sarà importantissimo
capirle tutte a fondo per determinare fino a dove possano servire alla
nostra causa o fino a quanto profondamente possiamo spingerci nel
definirle.&lt;br /&gt;
Che dire, spero di poterle utilizzare presto, anche se il caro sql server 2005 (come passa il tempo &lt;img src="http://blogs.dotnethell.it/icons/confused_smile.gif" alt="" /&gt;) resterà sui nostri ser