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