<?xml version="1.0" encoding="utf-8"?><!-- generator="b2evolution/6.11.7-stable" -->
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>SQL Server &#38; BI Blog by Andreas Wolter - Category: "Integration Services"</title>
		<link>https://www.insidesql.org/blogs/andreaswolter/</link>
		<atom:link rel="self" type="application/rss+xml" href="https://www.insidesql.org/blogs/andreaswolter/?tempskin=_rss2" />
		<description>InsideSQL.org Blogs - Blogs über SQL Server</description>
		<language>en-EU</language>
		<docs>http://blogs.law.harvard.edu/tech/rss</docs>
		<admin:generatorAgent rdf:resource="http://b2evolution.net/?v=6.11.7-stable"/>
		<ttl>60</ttl>
				<item>
			<title>Dieser Blog ist umgezogen // This Blog has moved: http://andreas-wolter.com/blog/</title>
			<link>https://www.insidesql.org/blogs/andreaswolter/2017/09/blog-umgezogen-this-blog-moved-andreas-wolter-com</link>
			<pubDate>Wed, 20 Sep 2017 10:41:00 +0000</pubDate>			<dc:creator>Andreas Wolter</dc:creator>
			<category domain="alt">Seminare</category>
<category domain="alt">SQLPASS</category>
<category domain="alt">Tracing &amp; Monitoring</category>
<category domain="alt">Analysis Services</category>
<category domain="alt">Extended Events</category>
<category domain="alt">Conferences</category>
<category domain="alt">Oracle</category>
<category domain="alt">Security</category>
<category domain="alt">Locking &amp; Blocking</category>
<category domain="alt">SQL Trace &amp; Profiler</category>
<category domain="alt">SQL Server 2014</category>
<category domain="alt">Indexing</category>
<category domain="alt">Columnstore Index</category>
<category domain="alt">APS/Parallel Data Warehouse</category>
<category domain="alt">Reporting Services</category>
<category domain="alt">Integration Services</category>
<category domain="main">Miscellaneous</category>
<category domain="alt">Geospatial</category>
<category domain="alt">Certification, MCM &amp; MCSM, MVP</category>
<category domain="alt">In-Memory OLTP / XTP, HTAP</category>
<category domain="alt">Surveys / Umfragen</category>
<category domain="alt">Scripts</category>
<category domain="alt">HADR, AlwaysOn</category>
<category domain="alt">MDW</category>
<category domain="alt">Storage Engine</category>
<category domain="alt">Trivia</category>
<category domain="alt">Azure</category>
<category domain="alt">Performance</category>
<category domain="alt">SQL Server 2016</category>
<category domain="alt">Patching</category>			<guid isPermaLink="false">3918@https://www.insidesql.org/blogs/</guid>
						<description>&lt;p&gt;&lt;a href=&quot;http://andreas-wolter.com/blog/&quot;&gt;http://andreas-wolter.com/blog/&lt;/a&gt;&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width=&quot;302&quot;&gt;
&lt;p&gt;Liebe Leser&lt;br /&gt; dieser Blog ist hiermit nur noch „Archiv“ und wird nicht mehr weiter gepflegt.&lt;br /&gt; Seit August 2017 finden sich neue Artikel ausschließlich unter der &lt;strong&gt;neuen URL:&lt;br /&gt; &lt;a href=&quot;http://andreas-wolter.com/blog/&quot;&gt;http://andreas-wolter.com/blog/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;302&quot;&gt;
&lt;p&gt;Dear Readers&lt;br /&gt; this blog is now merely an „archive“ and no longer being updated.&lt;br /&gt; Since August 2017 new articles are exclusively available under the &lt;strong&gt;new URL:&lt;br /&gt; &lt;a href=&quot;http://andreas-wolter.com/en/blog/&quot;&gt;http://andreas-wolter.com/en/blog/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;302&quot;&gt;
&lt;p&gt;Die aufwändige Mehrsprachigkeit (Deutsch und Englisch professionell manuell übersetzt) wird beibehalten – aber Layout-technisch anders gelöst. Damit dürfte ich immer noch den einzigen mehrsprachigen IT-Blog weltweit betreiben.&lt;br /&gt; Ich hoffe, das neue Design gefällt Ihnen.&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;302&quot;&gt;
&lt;p&gt;The complex multilingualism (German and English professionally manually translated) is being continued – but solved differently in terms of layout. With that I most likely still operate the only multilingual IT-Blog worldwide.&lt;br /&gt; I hope you like the new design.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div class=&quot;image_block&quot;&gt;&lt;a href=&quot;http://andreas-wolter.com/blog/&quot;&gt;&lt;img class=&quot;loadimg&quot; src=&quot;http://www.insidesql.org/blogs/media/blogs/andreaswolter/quick-uploads/p3918/170918_website_blog.jpg?mtime=1505903940&quot; alt=&quot;&quot; width=&quot;800&quot; height=&quot;552&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width=&quot;302&quot;&gt;
&lt;p&gt;Mein aktueller Artikel, der erstmalig ausschließlich auf der neuen Website zu finden ist, lautet: &lt;strong&gt;&lt;a href=&quot;http://andreas-wolter.com/optimierung-von-workflows-mit-inmemory-objekten/&quot;&gt;Optimieren von Workflows mit In-Memory und nativ kompilierten Objekten - oder wie es nicht funktioniert&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;302&quot;&gt;
&lt;p&gt;My currently last article, which is exclusively available at the new website for the first time, is &lt;strong&gt;&lt;a href=&quot;http://andreas-wolter.com/en/optimizing-workflows/&quot;&gt;Optimizing workflows with In-Memory and Natively Compiled Objects - or how it does not work&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Cu at my new Blog&lt;/p&gt;
&lt;p&gt;Andreas&lt;/p&gt;</description>
			<content:encoded><![CDATA[<p><a href="http://andreas-wolter.com/blog/">http://andreas-wolter.com/blog/</a></p>
<table>
<tbody>
<tr>
<td width="302">
<p>Liebe Leser<br /> dieser Blog ist hiermit nur noch „Archiv“ und wird nicht mehr weiter gepflegt.<br /> Seit August 2017 finden sich neue Artikel ausschließlich unter der <strong>neuen URL:<br /> <a href="http://andreas-wolter.com/blog/">http://andreas-wolter.com/blog/</a></strong></p>
</td>
<td width="302">
<p>Dear Readers<br /> this blog is now merely an „archive“ and no longer being updated.<br /> Since August 2017 new articles are exclusively available under the <strong>new URL:<br /> <a href="http://andreas-wolter.com/en/blog/">http://andreas-wolter.com/en/blog/</a></strong></p>
</td>
</tr>
<tr>
<td width="302">
<p>Die aufwändige Mehrsprachigkeit (Deutsch und Englisch professionell manuell übersetzt) wird beibehalten – aber Layout-technisch anders gelöst. Damit dürfte ich immer noch den einzigen mehrsprachigen IT-Blog weltweit betreiben.<br /> Ich hoffe, das neue Design gefällt Ihnen.</p>
</td>
<td width="302">
<p>The complex multilingualism (German and English professionally manually translated) is being continued – but solved differently in terms of layout. With that I most likely still operate the only multilingual IT-Blog worldwide.<br /> I hope you like the new design.</p>
</td>
</tr>
</tbody>
</table>
<p> </p>
<div class="image_block"><a href="http://andreas-wolter.com/blog/"><img class="loadimg" src="http://www.insidesql.org/blogs/media/blogs/andreaswolter/quick-uploads/p3918/170918_website_blog.jpg?mtime=1505903940" alt="" width="800" height="552" /></a></div>
<p> </p>
<table>
<tbody>
<tr>
<td width="302">
<p>Mein aktueller Artikel, der erstmalig ausschließlich auf der neuen Website zu finden ist, lautet: <strong><a href="http://andreas-wolter.com/optimierung-von-workflows-mit-inmemory-objekten/">Optimieren von Workflows mit In-Memory und nativ kompilierten Objekten - oder wie es nicht funktioniert</a></strong></p>
</td>
<td width="302">
<p>My currently last article, which is exclusively available at the new website for the first time, is <strong><a href="http://andreas-wolter.com/en/optimizing-workflows/">Optimizing workflows with In-Memory and Natively Compiled Objects - or how it does not work</a></strong></p>
</td>
</tr>
</tbody>
</table>
<p> </p>
<p>Cu at my new Blog</p>
<p>Andreas</p>]]></content:encoded>
								<comments>https://www.insidesql.org/blogs/andreaswolter/2017/09/blog-umgezogen-this-blog-moved-andreas-wolter-com#comments</comments>
			<wfw:commentRss>https://www.insidesql.org/blogs/andreaswolter/?tempskin=_rss2&#38;disp=comments&#38;p=3918</wfw:commentRss>
		</item>
				<item>
			<title>Integration Services: Looping &#38; “continue on error”</title>
			<link>https://www.insidesql.org/blogs/andreaswolter/2010/03/integration-services-looping-continue-on-error</link>
			<pubDate>Thu, 18 Mar 2010 20:32:00 +0000</pubDate>			<dc:creator>Andreas Wolter</dc:creator>
			<category domain="main">Integration Services</category>			<guid isPermaLink="false">3559@https://www.insidesql.org/blogs/</guid>
						<description>&lt;p&gt;Eine häufige Aufgabe bei der Arbeit mit Integration Services Paketen ist es, eine Routine in einer Schleife auszuführen.&lt;/p&gt;
&lt;p&gt;Nehmen wir den konkreten Fall: ein For Each-Loop zum rekursiven Auslesen von Textdateien aus einer Verzeichnisstruktur und Verschieben an einen Zielort.&lt;/p&gt;
&lt;p&gt;Wenn die Operation aufgrund von einer geöffneten Datei (z.B. der Log-Writer Prozess) fehlschlägt, schlägt damit der Task “Move file” fehl. Sodann der Container “For Each Loop”, und dann das gesamte Paket. Das ist das Standardverhalten: das Event “Error” wird propagiert.&lt;/p&gt;
&lt;p&gt;Das sieht in etwa so aus (hier mit einen For Loop):&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.andreas-wolter.com/blog-images/1003SSIS_EventPropagation_standard.jpg&quot; alt=&quot;SSIS_EventPropagation_standard&quot; width=&quot;464&quot; height=&quot;308&quot; border=&quot;0&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Man sieht trotz der versuchten “Fehlerbehandlung” in dem Script-Task “SCR-Fail” schlägt der Container fehl.&lt;/p&gt;
&lt;p&gt;Das ist in diesem Fall aber nicht unbedingt das gewünschte Ergebnis. &lt;br /&gt;Man möchte, das die Operation einfach mit der nächsten Datei fortfährt und eventuell liegengebliebene Dateien in einem späteren Durchlauf einfach holen.&lt;/p&gt;
&lt;p&gt;Dafür muss man das propagieren des Fehlers auf Container-Ebene unterbinden. Die dafür extra vorhandene Systemvariable “Propagate” ist ausnahmsweise deswegen auch manuell änderbar. Allerdings gibt es diese nur in den Event Handlern.&lt;/p&gt;
&lt;p&gt;Das heisst für den fehlschlagenen SQL-Task in diesem Beispiel ist ein EventHandler für “OnError” anzulegen. Dort findet man dann die besagte Variable und schaltet sie auf False&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.andreas-wolter.com/blog-images/1003SSIS_EventPropagation_SystemVariablePropagate.jpg&quot; alt=&quot;SSIS_EventPropagation_SystemVariablePropagate&quot; width=&quot;551&quot; height=&quot;109&quot; border=&quot;0&quot; /&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Das würde an sich schon genügen, um das Paket einfach weiterlaufen zu lassen.&lt;/p&gt;
&lt;p&gt;Allerdings ist es in der Regel wünschenswert, im Anschluss eine bedingte Reaktion auf das erfolgreiche oder erfolglose Verschieben der Datei erfolgen zu lassen. In diesem Beispiel ein T-SQL-Schritt bei Erfolg, und der Script-Task “Fail” bei Misserfolg.&lt;/p&gt;
&lt;p&gt;Da nun kein Fehler mehr propagiert wird, ist ein kleiner Kunstgriff vonnöten: Man definiert sich eine Variable, welche im Fehlerfall einen anderen Wert erhält und liest diese dann bei dem Precedence-Constraint zusätzlich mit aus.&lt;/p&gt;
&lt;p&gt;Am einfachsten geht das mit dem im Fehlerfall ohnehin vorhandenen ErrorCode – innerhalb des EventHandler natürlich.&lt;/p&gt;
&lt;p&gt;Dort leitet man den Wert der Systemvariable “ErrorCode” einfach in seine eigens zuvor angelegte User-Variable um:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Dts.Variables(&quot;User::ErrorCode&quot;).Value = Dts.Variables(&quot;System::ErrorCode&quot;).Value&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Im ControlFlow wird dann ein “OnCompletion” – Precedence Constraint verwendet, und zusätzlich die Variable in der Expression &quot;&lt;em&gt;@[User::ErrorCode] != 0&lt;/em&gt;&quot; ausgewertet&lt;/p&gt;
&lt;p&gt;Das gewünschte Ergebnis verhält sich dann so:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.vb-magazin.de/forums/blogs/andreaswolter/1003SSIS_EventPropagation_Result_1446EC1E.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://www.andreas-wolter.com/blog-images/1003SSIS_EventPropagation_Result.jpg&quot; alt=&quot;SSIS_EventPropagation_Result&quot; width=&quot;459&quot; height=&quot;303&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Der Fehler im Task wird abgehandelt, und die Arbeit wird fortgesetzt.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;happy coding :)&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Andreas Wolter&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.sarpedonqualitylab.com/&quot; target=&quot;_blank&quot;&gt;Sarpedon Quality Lab&lt;/a&gt;&lt;/p&gt;</description>
			<content:encoded><![CDATA[<p>Eine häufige Aufgabe bei der Arbeit mit Integration Services Paketen ist es, eine Routine in einer Schleife auszuführen.</p>
<p>Nehmen wir den konkreten Fall: ein For Each-Loop zum rekursiven Auslesen von Textdateien aus einer Verzeichnisstruktur und Verschieben an einen Zielort.</p>
<p>Wenn die Operation aufgrund von einer geöffneten Datei (z.B. der Log-Writer Prozess) fehlschlägt, schlägt damit der Task “Move file” fehl. Sodann der Container “For Each Loop”, und dann das gesamte Paket. Das ist das Standardverhalten: das Event “Error” wird propagiert.</p>
<p>Das sieht in etwa so aus (hier mit einen For Loop):</p>
<p><img src="http://www.andreas-wolter.com/blog-images/1003SSIS_EventPropagation_standard.jpg" alt="SSIS_EventPropagation_standard" width="464" height="308" border="0" /></p>
<p>Man sieht trotz der versuchten “Fehlerbehandlung” in dem Script-Task “SCR-Fail” schlägt der Container fehl.</p>
<p>Das ist in diesem Fall aber nicht unbedingt das gewünschte Ergebnis. <br />Man möchte, das die Operation einfach mit der nächsten Datei fortfährt und eventuell liegengebliebene Dateien in einem späteren Durchlauf einfach holen.</p>
<p>Dafür muss man das propagieren des Fehlers auf Container-Ebene unterbinden. Die dafür extra vorhandene Systemvariable “Propagate” ist ausnahmsweise deswegen auch manuell änderbar. Allerdings gibt es diese nur in den Event Handlern.</p>
<p>Das heisst für den fehlschlagenen SQL-Task in diesem Beispiel ist ein EventHandler für “OnError” anzulegen. Dort findet man dann die besagte Variable und schaltet sie auf False</p>
<p><img src="http://www.andreas-wolter.com/blog-images/1003SSIS_EventPropagation_SystemVariablePropagate.jpg" alt="SSIS_EventPropagation_SystemVariablePropagate" width="551" height="109" border="0" /> </p>
<p> </p>
<p>Das würde an sich schon genügen, um das Paket einfach weiterlaufen zu lassen.</p>
<p>Allerdings ist es in der Regel wünschenswert, im Anschluss eine bedingte Reaktion auf das erfolgreiche oder erfolglose Verschieben der Datei erfolgen zu lassen. In diesem Beispiel ein T-SQL-Schritt bei Erfolg, und der Script-Task “Fail” bei Misserfolg.</p>
<p>Da nun kein Fehler mehr propagiert wird, ist ein kleiner Kunstgriff vonnöten: Man definiert sich eine Variable, welche im Fehlerfall einen anderen Wert erhält und liest diese dann bei dem Precedence-Constraint zusätzlich mit aus.</p>
<p>Am einfachsten geht das mit dem im Fehlerfall ohnehin vorhandenen ErrorCode – innerhalb des EventHandler natürlich.</p>
<p>Dort leitet man den Wert der Systemvariable “ErrorCode” einfach in seine eigens zuvor angelegte User-Variable um:</p>
<p><em>Dts.Variables("User::ErrorCode").Value = Dts.Variables("System::ErrorCode").Value</em></p>
<p>Im ControlFlow wird dann ein “OnCompletion” – Precedence Constraint verwendet, und zusätzlich die Variable in der Expression "<em>@[User::ErrorCode] != 0</em>" ausgewertet</p>
<p>Das gewünschte Ergebnis verhält sich dann so:</p>
<p><a href="http://www.vb-magazin.de/forums/blogs/andreaswolter/1003SSIS_EventPropagation_Result_1446EC1E.jpg" target="_blank"><img src="http://www.andreas-wolter.com/blog-images/1003SSIS_EventPropagation_Result.jpg" alt="SSIS_EventPropagation_Result" width="459" height="303" border="0" /></a></p>
<p>Der Fehler im Task wird abgehandelt, und die Arbeit wird fortgesetzt.</p>
<p> </p>
<p>happy coding :)</p>
<p> </p>
<p>Andreas Wolter</p>
<p> </p>
<p><a href="http://www.sarpedonqualitylab.com/" target="_blank">Sarpedon Quality Lab</a></p>]]></content:encoded>
								<comments>https://www.insidesql.org/blogs/andreaswolter/2010/03/integration-services-looping-continue-on-error#comments</comments>
			<wfw:commentRss>https://www.insidesql.org/blogs/andreaswolter/?tempskin=_rss2&#38;disp=comments&#38;p=3559</wfw:commentRss>
		</item>
			</channel>
</rss>
