SQLBulkCopy y fechas (1/1/1753)

ado.net datetime sqlbulkcopy sql-server

Pregunta

Tengo una aplicación que ha estado funcionando bien durante bastante tiempo, pero hay un elemento molesto que sigue estorbando en ocasiones.

Digamos que uso un objeto como OracleDataReader o MySQLDataReader para pasar los datos al objeto sqlbulkcopy para insertar. Supongamos que todas las columnas se asignan bien y, en su mayor parte, todo funciona bien.

Por supuesto, no tengo control sobre la aplicación de origen o la base de datos (que es MySQL u Oracle). Así que algunos errores van en una aplicación diferente y ponen una fecha en la tabla de facturas del 31/05/0210. Realmente quiso ponerlo el 31 de mayo de 2010, pero la aplicación que está usando no está validando los datos muy bien y la base de datos de Oracle los acepta. Para todos los fines intensivos, los datos del 31/05/0210 son una fecha válida para la base de datos de Oracle. Podría ser estúpido en términos de entrada de datos, pero es lo que es en este punto.

Ahora viene nuestro OracleDataReader y transfiere esta tabla de facturas a SQL Server a través de SQLBulkCopy. Pasa los datos a la tabla perfectamente combinada con los nombres de columna y los tipos de datos correctos. Puedes ver lo que va a pasar. Esta fecha del 31/05/0210 de Oracle no es aceptada por el motor db de SQL Server, ya que el campo DATETIME solo permite fechas del 1/1/1753 al 12/31/9999.

Cuando encuentra este registro, simplemente falla y da un error de desbordamiento. No omite el registro, mata la alimentación. Entonces, si se producen mil registros en una tabla de un millón de registros, no se obtienen los 999,000 registros restantes.

¿Hay alguna forma de solucionar este problema para que la alimentación continúe?

Idealmente, me gustaría mover la base de datos de SQL Server receptora a 2008 y usar DATETIME2, lo que permitiría estas fechas tontas, pero desafortunadamente no todos mis clientes están listos para pasar a esta versión todavía, así que estoy atascado con DATETIME en SQL 2000/2005/2008.

¿Alguna idea sobre cómo solucionar esto sin cambiar el SQL? Idealmente, no me importaría si se saltara el disco. Sé que podría hacer esto en el SQL para el datareder, pero esto sería extremadamente complicado si tiene veinte campos de fecha en una sola consulta. Sería una pesadilla de mantenimiento.

Cualquier pensamiento sería apreciado.

Respuesta popular

Una opción sería cambiar el tipo de columna de fecha y hora a varchar. Luego agregue una columna derivada para convertir la cadena a datetime. El truco consistiría en utilizar una función en la columna derivada para validar la fecha y establecer una fecha y hora arbitraria si la cobertura fallara. Si realiza comparaciones de fechas pesadas, mantenga la columna calculada y / o indexe.

Digo todo esto bajo la impresión de que sqlbulkcopy no puede hacer transformaciones. Tal vez tu puedas. Con suerte, alguien intervendrá con una forma de.

SSIS sería genial en esta situación, ya que podría hacer la transformación y también obtener los beneficios de rendimiento del bloqueo de actualización masiva.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué