Mejorar una salida de errores con el componente de script

Se aplica a:SQL Server SSIS Integration Runtime en Azure Data Factory

De forma predeterminada, las dos columnas adicionales en una salida de errores de Integration Services (ErrorCode y ErrorColumn), únicamente contienen códigos numéricos que representan un número de error y el identificador de la columna en la que se produjo el error. Estos valores numéricos pueden tener un uso limitado sin la descripción del error y el nombre de columna correspondientes.

En este tema se describe cómo agregar la descripción del error y el nombre de la columna a los datos de salida del error existentes en el flujo de datos mediante el componente de script. En el ejemplo se agrega la descripción del error que corresponde a un determinado código de error de Integration Services predefinido mediante el método GetErrorDescription de la interfaz IDTSComponentMetaData100, disponible a través de la propiedad ComponentMetaData del componente de script. A continuación, en el ejemplo se agrega el nombre de columna que corresponde al id. de linaje capturado mediante el método GetIdentificationStringByID de la misma interfaz.

Nota

Si desea crear un componente que pueda reutilizar más fácilmente en varias tareas de flujo de datos y varios paquetes, puede utilizar el código de este ejemplo de componente de script como punto de inicio para el componente de flujo de datos personalizado. Para obtener más información, vea Desarrollar un componente de flujo de datos personalizado.

Ejemplo

En el ejemplo que aparece aquí se utiliza un componente de script configurado como transformación para agregar la descripción del error y el nombre de columna a los datos de salida de error existentes en el flujo de datos.

Para obtener más información acerca de cómo configurar el componente de script para su uso como transformación en el flujo de datos, vea Crear una transformación sincrónica con el componente de script y Crear una transformación asincrónica con el componente de script.

Para configurar este ejemplo de componente de script

  1. Antes de crear el nuevo componente de script, configure un componente de nivel superior en el flujo de datos para redirigir las filas a su salida de error cuando se produce un error o truncamiento. Con fines de prueba, puede que quiera configurar un componente de manera que garantice que se van a producir errores (por ejemplo, mediante la configuración de una transformación Búsqueda entre dos tablas donde se producirá un error en la búsqueda).

  2. Agregue un nuevo componente de script a la superficie del diseñador de flujo de datos y configúrelo como una transformación.

  3. Conecte la salida de error del componente de nivel superior al nuevo componente de script.

  4. Abra el Editor de transformación Script y en la página Script, para la propiedad ScriptLanguage, seleccione el lenguaje de script.

  5. Haga clic en Editar script para abrir el IDE de Microsoft Visual Studio Tools for Applications (VSTA) y agregue el código de ejemplo que se muestra a continuación.

  6. Cierre VSTA.

  7. En el Editor de transformación Script, en la página Columnas de entrada, seleccione las columnas ErrorCode y Error Column.

  8. En la página Entradas y salidas, agregue dos nuevas columnas.

    • Agregue una nueva columna de salida de tipo String denominada ErrorDescription. Aumente la longitud predeterminada de la nueva columna a 255 para admitir mensajes largos.

    • Agregue otra columna de salida nueva de tipo String denominada ColumnName. Aumente la longitud predeterminada de la nueva columna a 255 para admitir valores largos.

  9. Cierre el Editor de transformación Script.

  10. Adjunte la salida del componente de script a un destino conveniente. Para pruebas ad hoc, la manera más fácil de configurar es mediante un destino de archivo plano.

  11. Ejecute el paquete.

Public Class ScriptMain      ' VB
    Inherits UserComponent
    Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)

        Row.ErrorDescription = _
            Me.ComponentMetaData.GetErrorDescription(Row.ErrorCode)

        Dim componentMetaData130 = TryCast(Me.ComponentMetaData, IDTSComponentMetaData130)

        If componentMetaData130 IsNot Nothing Then

            If Row.ErrorColumn = 0 Then
                ' 0 means no specific column is identified by ErrorColumn, this time.
                Row.ColumnName = "Check the row for a violation of a foreign key constraint."
            ELSE If Row.ErrorColumn = -1 Then
                ' -1 means you are using Table Lock for a Memory Optimised destination table which is not supported.
                Row.ColumnName = "Table lock is not compatible with Memory Optimised tables."
            Else
                Row.ColumnName = componentMetaData130.GetIdentificationStringByID(Row.ErrorColumn)
            End If
        End If
    End Sub
End Class
public class ScriptMain:      // C#
    UserComponent
{
    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        Row.ErrorDescription = this.ComponentMetaData.GetErrorDescription(Row.ErrorCode);

        var componentMetaData130 = this.ComponentMetaData as IDTSComponentMetaData130;
        if (componentMetaData130 != null)
        {
            // 0 means no specific column is identified by ErrorColumn, this time.
            if (Row.ErrorColumn == 0)
            {
                Row.ColumnName = "Check the row for a violation of a foreign key constraint.";
            }
            // -1 means you are using Table Lock for a Memory Optimised destination table which is not supported.
            else if (Row.ErrorColumn == -1)
            {
                Row.ColumnName = "Table lock is not compatible with Memory Optimised tables.";
            }
            else
            {
                Row.ColumnName = componentMetaData130.GetIdentificationStringByID(Row.ErrorColumn);
            }
        }
    }
}

Consulte también

Control de errores en los datos
Usar las salidas de error en un componente de flujo de datos
Crear una transformación sincrónica con el componente de script