Submitted byCategory
Review Cycle
.
Public
Joachim Mutter/sysarc
on 04/21/2009 at 10:05 AM
SSiS\Doku

OLE DB Command Fehlerbehandlung

Das Redirect von Zeilen an den ErrorHandler funktioniert nicht in allen Lebenslagen.
Folgende Ereignisse lösen ein ReDirect aus:


Will man nun für Datenfehler ein ReDirect der Task haben, damit der Dataflow nicht mit einem Fehler endet,
sondern den Fehler geloggt und ansonsten weiter gemacht wird, dann muss man den Errorhandler der Task
entsprechend auf ReDirect-Rows setzen und eine Fehlerbehandlung machen.
Dummerweise wird hier immer nur ein sehr allgemein gehaltenen Fehler von der OLE Komponente zurück
geliefert, der nicht wirklich bei der Fehlersuche weiterhilft.
Um dies zu verbessern kann man ja nun auf den Gedanken kommen, den T-SQL Code per Try - Catch zu
kapseln, um dort den konkreten SQL Fehler zu loggen. Damit dann zusätzliche Aktionen in SSiS folgen können
müsste man nun nur noch per RAISERROR dafür sorgen, dass das ReDirect der OLE Command Task getriggert
wird. Aber das funktioniert leider nicht.
Sobald ein RAISERROR mit einem SeverityLevel > 10 im CATCH Block ausgeführt wird, geht die Task in eine
Error State statt das ReDirect auszuführen. Alle Versuche, das zu verhindern funktionieren leider nicht.

Es gibt aber 2 Möglichkeiten, diesem Problem zu begegenen:

1. Erzeugen einen Fehler bezogen auf die betroffene Tabelle
BEGIN CATCH
INSERT INTO [dbo].[ImError] ([ER_ImportID],[ER_Timestamp],[ER_ErrorCol],[ER_ErrorText],
[ER_ErrorDescription],[ER_Taskname]
) VALUES (
@ExecID,GETDATE(),ERROR_LINE()
,'Error[CuContact], ' + CONVERT(VARCHAR(2), @IsExtLookup) + ',' + CONVERT(VARCHAR(12)
, @AccountID),Error_Message(),'SF_ContactImport'
)

-- This is responsible for redirect the error from the SSiS OLEDB Task
INSERT INTO [dbo].[CuContact] ([CT_PartnerID]) VALUES(NULL)
END CATCH


2. Arbeit mit einem Ausgabe Parameter
  1. Erzeugung der zusätzlichen Spalte Ret als dtr_string(1024)
  2. Statt dem Fehlerausgang den normalen dataflow ausgang wählen
  3. ConditionTask prüft Spalte Ret auf einen Wert != '', was einen Fehler identifiziert, der im Catch Block
    dem OUTPUT Parameter zugwiesen wurde.
    Zusätzlich wurde ein Parameter @Rethrow eingebaut, mit dem das Verhalten (Raiserror / Verwendung
    OUTPUT Parameter) steuerbar ist. Siehe folgenden Code:

English Explanation

Found in the Internet