{"id":219,"date":"2012-11-18T10:03:00","date_gmt":"2012-11-18T09:03:00","guid":{"rendered":"http:\/\/csopro.de\/biblog\/2012\/11\/ssis-laufzeitprotokollierung-je-task\/"},"modified":"2014-12-31T18:26:52","modified_gmt":"2014-12-31T17:26:52","slug":"ssis-laufzeitprotokollierung-je-task","status":"publish","type":"post","link":"https:\/\/www.csopro.de\/biblog\/2012\/11\/ssis-laufzeitprotokollierung-je-task\/","title":{"rendered":"SSIS: Laufzeitprotokollierung je Task"},"content":{"rendered":"<p>Wenn man gr\u00f6\u00dfere SSIS-Jobs schreibt, sollten diese Jobs sp\u00e4ter auf ihre Laufzeiten kontrolliert werden. L\u00e4uft die Laufzeit eines SSIS-Jobs aus dem Ruder, ist es sinnvoll, protokolliert zu haben, wie lange welcher Task des SSIS-Jobs l\u00e4uft, um schnell den Schuldigen ausfindig zu machen. Alternative Techniken wie Analyse des Log-Files sind sehr m\u00fchselig.<\/p>\n<p>In dem Code-Beispiel gehen wir davon aus, dass es eine SQL-Tabelle gibt, in der f\u00fcr jeden SSIS-Job ein Eintrag erzeugt wird, so dass es eine eindeutige Lauf-ID gibt. Diese Lauf-ID wird im ersten Schritt des SSIS-Jobs erzeugt. Dies ist bei uns \u201cBest Practice\u201d<\/p>\n<p>Zur Protokollierung legen wir eine Tabelle wie folgt an:<\/p>\n<blockquote>\n<p>CREATE TABLE [dbo].[META_ImportLaufTaskDauer](      <br \/>&#160;&#160;&#160; [ImportLauf_ID] [int] NOT NULL,       <br \/>&#160;&#160;&#160; [TaskName] [nvarchar](200) NOT NULL,       <br \/>&#160;&#160;&#160; [Startzeitpunkt] [datetime] NOT NULL,       <br \/>&#160;&#160;&#160; [Endezeitpunkt] [datetime] NULL,       <br \/>CONSTRAINT [PK_META_ImportLaufTaskDauer] PRIMARY KEY CLUSTERED       <br \/>(       <br \/>&#160;&#160;&#160; [ImportLauf_ID] ASC,       <br \/>&#160;&#160;&#160; [TaskName] ASC       <br \/>)       <br \/>) <\/p>\n<\/blockquote>\n<p>Die Spaltennamen sollten selbst erkl\u00e4rend sein.<\/p>\n<p>In diese Tabelle wird nun \u00fcber Events im SSIS-Paket geschrieben. Dazu werden auf der obersten Ebene des Pakets (und nur dort \u2013 also nicht etwa f\u00fcr jede Task) die Events f\u00fcr <strong>OnPreExecute<\/strong> und <strong>OnPostExecute<\/strong> angelegt:<\/p>\n<p>In dem <strong>OnPreExecute<\/strong> wird nun der Startzeitpunkt der Task in die Tabelle geschrieben\u2026 :<\/p>\n<p><a href=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2012\/11\/image2.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px\" title=\"OnPreExecute\" border=\"0\" alt=\"OnPreExecute\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2012\/11\/image-thumb2.png\" width=\"547\" height=\"285\" \/><\/a><\/p>\n<p>Dazu wird ein Execute SQL-Task angelegt. Dieser beinhaltet folgendes SQL:<\/p>\n<blockquote>\n<p>declare @Laufid int      <br \/>set @Laufid = ?<\/p>\n<p>if @LaufId &gt; 0      <br \/>&#160; INSERT INTO META_ImportLaufTaskDauer (ImportLauf_ID, TaskName, Startzeitpunkt)       <br \/>VALUES       <br \/>&#160; (@laufid, left(?, 200), getdate())<\/p>\n<\/blockquote>\n<p>Das Mapping der Variablen sieht so aus:<\/p>\n<p><a href=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2012\/11\/image3.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px\" title=\"OnPreExecuteParameter\" border=\"0\" alt=\"Parameter bei OnPreExecute\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2012\/11\/image-thumb3.png\" width=\"639\" height=\"212\" \/><\/a><\/p>\n<p>Die ID des Importlaufs findet sich hier in der Benutzer-Variablen LaufID. Die andere Variable ist eine System-Variable, die uns den verantwortlichen Task nennt.<\/p>\n<p>\u2026 und im <strong>OnPostExecute<\/strong> der Endzeitpunkt der Task mit folgendem SQL:<\/p>\n<blockquote>\n<p>declare @Laufid int      <br \/>set @Laufid = ?<\/p>\n<p>if @LaufId &gt; 0      <br \/>UPDATE META_ImportLaufTaskDauer       <br \/>Set Endezeitpunkt = getdate()       <br \/>where ImportLauf_ID = @Laufid and TaskName= left(?, 200)<\/p>\n<\/blockquote>\n<p><font color=\"#777777\">Das ParameterMapping ist wie im OnPreExecute.<\/font><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn man gr\u00f6\u00dfere SSIS-Jobs schreibt, sollten diese Jobs sp\u00e4ter auf ihre Laufzeiten kontrolliert werden. L\u00e4uft die Laufzeit eines SSIS-Jobs aus dem Ruder, ist es sinnvoll, protokolliert zu haben, wie lange welcher Task des SSIS-Jobs l\u00e4uft, um schnell den Schuldigen ausfindig zu machen. Alternative Techniken wie Analyse des Log-Files sind sehr m\u00fchselig. In dem Code-Beispiel gehen &hellip; <a href=\"https:\/\/www.csopro.de\/biblog\/2012\/11\/ssis-laufzeitprotokollierung-je-task\/\" class=\"more-link\"><span class=\"screen-reader-text\">SSIS: Laufzeitprotokollierung je Task<\/span> weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10],"tags":[22],"class_list":["post-219","post","type-post","status-publish","format-standard","hentry","category-integrationservices","tag-events"],"_links":{"self":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/219","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/comments?post=219"}],"version-history":[{"count":1,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/219\/revisions"}],"predecessor-version":[{"id":267,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/219\/revisions\/267"}],"wp:attachment":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/media?parent=219"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/categories?post=219"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/tags?post=219"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}