Migrando datos con la utilidad BCP de SQL Server 2005

A continuación les paso a detallar el inconveniente detectado de "registros con datos basura" al utilizar la herramienta "BCP", la solución aplicada y también aclaraciones importantes al momento de utilizar la herramienta citada en párrafos anteriores.

Escenario

Server Origen/Destino:

Windows Server 2003 Standart Edition SP1
MS SQL Server 2005 Standart Edition SP2

Utilidad: BCP (Bulk Copy Program), utilidad de línea de comando (shell) de SQl Server.

Tabla: TxnTable

Base: Mibase, MibaseOLD

Sentencia:

bcp MibaseOLD.dbo.TxnTable OUT D:\mssql.1\mssql\data\migracion\MibaseOLD\dbo.Txnvieja.txt -E -T -SDBServer01 -c -eD:\mssql.1\mssql\data\migracion\MibaseOLD\dbo.Txnvieja.files -oD:\mssql.1\mssql\data\migracion\MibaseOLD\descarga\dbo.Txnvieja.out

bcp Mibase.dbo.TxnTable IN D:\mssql.1\mssql\data\migracion\MibaseOLD\dbo.Txnvieja.txt -E -T -SDBServer02 -c -b500 -eD:\mssql.1\mssql\data\migracion\MibaseOLD\dbo.TxnTable.files -oD:\mssql.1\mssql\data\migracion\MibaseOLD\carga\dbo.TxnTxnTable.out

Síntoma: La herramienta NO detecta errores en la copia y por ende no descarta registros. (archivos dbo.Txnvieja.out y dbo.TxnVieja.files)

Sin embargo cuando se ejecuta una transaccion vía la aplicación financiera, se cuelga la aplicación y deben resetear la wks. Esta transacción hace un barrido de toda la tabla TxnTable.

Error: Se lanza la siguiente sentencia y se detecta que existen registros con caracteres inválidos al comienzo del registro solo para un lote de datos, en este caso, 142 rows dentro de un conjunto de 256488 rows.

TSQL => "SELECT IDClient,NbrCTA,TypeOp,dateOp FROM TxnTable EXCEPT SELECT IDClient,NbrCTA,TypeOp,dateOp FROM MibaseOLD.dbo.TxnTable"

Solución: Se modifica la sentencia BCP agregando como terminador de registro el simbolo de ascii extendido 234 "Û".
Esta solución debio aplicarse debido a que el default row terminator (\r\n) de la utilidad BCP interfiere con algunos registros cargados, ya que algunos registros ya tienen "Carriage return/line feed" al final. Por lo tanto cuando bcp exporta con el default row terminator, agrega \r\n al final de todos los registros, y entonces cuando se importan se encuentra con que algunos ya tenían (\r\n) y traslada el (\r\n) que le sobra a la primera columna del siguiente registro.
Otra posible solución, sería borrar los (\r\n) del origen antes de exportar, como por ejemplo utilizando la función REPLACE.

Sentencia implementada:

bcp MibaseOLD.dbo.TxnTable OUT D:\mssql.1\mssql\data\migracion\MibaseOLD\dbo.TxnTable.txt -E -T -SDBServer01 -c -rÛ -eD:\mssql.1\mssql\data\migracion\MibaseOLD\dbo.TxnTable.files -oD:\mssql.1\mssql\data\migracion\MibaseOLD\descarga\dbo.TxnTable.out

bcp Mibase.dbo.TxnTable IN D:\mssql.1\mssql\data\migracion\MibaseOLD\dbo.TxnTable.txt -E -T -SDBServer02 -c -b500 -rÛ -eD:\mssql.1\mssql\data\migracion\MibaseOLD\dbo.TxnTable.files -oD:\mssql.1\mssql\data\migracion\MibaseOLD\carga\dbo.TxnTable.out

Abrazo virtual a todos !!!

Link's Relacionados:
Performance BCP - BULK INSERT Parte 1
Performance BCP - BULK INSERT Parte 2
Performance BCP - BULK INSERT Parte 3