Miejsce docelowe SSIS OLE DB - błąd przekierowania wyjścia błędu bez opisu

Nov 26 2020

Przeżywam coś dziwnego. Mam zadanie przepływu danych w pakiecie SSIS ze źródłem OLE DB, które pobiera dane z tabeli - wtedy istnieje transformacja wyszukiwania, która sprawdza, czy klucz wiersza już istnieje w tabeli docelowej (klucz podstawowy w tabeli docelowej), a następnie wyszukiwanie nie match Wyjście jest połączone z miejscem docelowym OLE DB. Połączyłem również wyjście błędu z miejsca docelowego OLE DB w składniku skryptu, który otrzymuje komunikat o błędzie i kolumnę błędu na wypadek, gdyby coś poszło nie tak, i wstawia te dane do tabeli wyjątków.

Problem, z którym się spotykam, polega na tym, że mam zduplikowane klucze wierszy w mojej tabeli źródłowej, więc w tym przypadku błąd zostaje przekierowany z miejsca docelowego OLE DB do mojej tabeli wyjątków, ale opis błędu, który otrzymuję w tabeli wyjątków, to „Brak statusu jest dostępny „zamiast„ Naruszenie ograniczenia PRIMARY KEY..Nie można wstawić zduplikowanego klucza do obiektu..Duplikowany klucz ma wartość… ”. Oto zrzut ekranu pakietu,

a tutaj kod skryptu:

public bool fireAgain = true;
public string customErrorDescription;
public string customErrorDescription;
public string ErrorDescription;
public string ErrorColumnDescription;
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
try
{
    var component130 = ComponentMetaData as IDTSComponentMetaData130;

    if (component130 != null)
    {
        Row.DateTimeInserted = DateTime.Now;

        if (Row.ErrorColumn <= 0)
        {
            ErrorColumnDescription = "No Data available - Unknown Error";
        }
        else if (Row.ErrorColumn > 0)
        {

            ErrorColumnDescription = component130.GetIdentificationStringByID(Row.ErrorColumn);
        }
        ErrorDescription = component130.GetErrorDescription(Row.ErrorCode).Replace("\r\n", " ");

        //Writes the error as Information in Logging
        customErrorDescription =
         $"Error in OLE DB Destination:{ErrorDescription}" + $"In Column: {ErrorColumnDescription}";
        ComponentMetaData.FireInformation(10, "Error", "Error", ErrorDescription, 0, fireAgain);

        Row.ErrorDescription = ErrorDescription;
        Row.ErrorColumnDescription = ErrorColumnDescription;
        Row.DestinationTableName = Variables.DestinationTable;
        Row.SourceName = "Source_View";
        Row.SourceType = "View";
    }
}
catch (Exception Ex)
{
    ComponentMetaData.FireError(10, "Error", Ex.Message, Ex.Message, 0, out fireAgain);
}

}

Chciałbym wspomnieć, że w innych błędach, takich jak obcinanie lub wstawianie wartości null w kolumnie, która nie jest dozwolona, ​​wydaje się działać dobrze.

Na przykład podczas obcięcia otrzymuję: „Konwersja nie powiodła się, ponieważ wartość danych przepełniła typ używany przez dostawcę”. W przypadku naruszenia ograniczenia NULL otrzymuję: „Wartość danych narusza ograniczenia integralności”.

Jakieś sugestie lub przemyślenia na temat tego, dlaczego dzieje się tak tylko z wkładką klucza Dublicate? Z góry dziękuję!

Odpowiedzi

Hadi Nov 29 2020 at 21:02

Należy zauważyć, że wykonywane są dwa typy walidacji w miejscu docelowym OLE DB: (1) po stronie klienta i (2) po stronie serwera. Możesz sprawdzić następującą odpowiedź, aby uzyskać więcej informacji:

  • Szybkie wyjście błędu ładowania nie przekierowuje całej partii

Silnik SSIS nie przechwytuje opisów błędów po stronie serwera (klucze obce, wyzwalacze ...) w czasie wykonywania, podczas gdy opisy błędów walidacji po stronie klienta (obcięcie, Not null ...) są czytelne.