Destino SSIS OLE DB - Erro de redirecionamento de saída de erro sem descrição

Nov 26 2020

Estou passando por algo estranho. Eu tenho uma tarefa de fluxo de dados dentro de um pacote SSIS com uma fonte de banco de dados OLE que busca dados de uma tabela - então há uma transformação de pesquisa que verifica se a chave de linha já existe na tabela de destino (chave primária na tabela de destino), em seguida, o número de pesquisa A saída de correspondência está conectada ao Destino OLE DB. Eu também conectei a saída de erro do destino OLE DB em um componente de script que obtém a mensagem de erro e a coluna de erro caso algo dê errado e insere esses dados em uma tabela de exceção.

O problema que enfrento é que tenho chaves de linha duplicadas em minha tabela de origem, então nesse caso o erro é redirecionado do destino OLE DB para minha tabela de exceções, mas a descrição do erro que obtenho na tabela de exceções é "Nenhum status está disponível "em vez de" Violação da restrição PRIMARY KEY .. Não é possível inserir chave duplicada no objeto .. O valor da chave duplicada é .. "Aqui está uma captura de tela do pacote

e aqui está o código do script:

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);
}

}

Eu gostaria de mencionar que em outros erros como truncamento ou inserção de nulo em uma coluna que nulo não é permitido, isso parece funcionar bem.

Por exemplo, em truncamento, recebo: "A conversão falhou porque o valor dos dados ultrapassou o tipo usado pelo provedor." Na violação de restrição NULL, obtenho: "O valor dos dados viola as restrições de integridade."

Alguma sugestão ou reflexão sobre por que isso está acontecendo apenas com a inserção da chave Dublicate? Desde já, obrigado!

Respostas

Hadi Nov 29 2020 at 21:02

Você deve observar que dois tipos de validações são realizados no Destino OLE DB: (1) Lado do cliente e (2) Lado do servidor. Você pode verificar a seguinte resposta para obter mais detalhes:

  • A saída de erro de carregamento rápido não redireciona o lote inteiro

O mecanismo SSIS não captura as descrições dos erros do lado do servidor (chaves estrangeiras, gatilhos ...) em tempo de execução, enquanto as descrições dos erros de validação do lado do cliente (truncamento, não nulo ...) são legíveis.