2008-08-28 14 views
5

Esta es una base de datos sql 2000 con la que estoy trabajando.SQL 2000 'TRY CATCH like' Manejo de errores

Tengo lo que llamo una tabla de etapas que es un volcado de datos sin procesar de datos, entonces todo es ntext o nvarchar (255).

necesito fundido/convertir todos estos datos en los tipos de datos apropiados (es decir, int, decimal, nvarchar, etc.)

La forma en que iba a hacer esto era para iterar a través de todos los registros utilizando una while loop e intento un CAST en cada columna en un solo registro durante cada iteración, después de visitar un registro en particular lo señalo como procesado (campo de bit).

Pero, ¿cómo puedo registrar el error cuando/si ocurre pero permitir que el ciclo while continúe.

Al principio implementé esto usando TRY CATCH en una instancia local de SQL 2005 (para poner en marcha el proyecto) y todo funcionaba bien, pero hoy supe que la base de datos de desarrollo dev & que los DBA internacionales han configurado es una instancia de SQL 2000, así que tengo que conformarme.

EDIT: Estoy usando un paquete de SSIS para rellenar la tabla de etapas. Veo que ahora debo volver a visitar ese paquete e implementar un componente de script para manejar las conversiones. Gracias chicos

EDIT: I am hacer esto en un registro de base de registro, no un lote insertar, por lo que la idea de transacción parece como que sería factible, pero no estoy seguro de cómo atrapar @@ ERROR y permita que el procedimiento almacenado continúe.

EDIT: Me gusta mucho Guy's approach, lo voy a implementar de esta manera.

Respuesta

2

Generalmente no me gusta "bucle a través de los discos" soluciones ya que tienden a ser lentos y terminas escribiendo una gran cantidad de código personalizado.

Entonces ...

Dependiendo de cuántos registros están en su tabla de ensayo, puede publicar los datos de proceso con una serie de sentencias SQL que ponen a prueba las columnas para la corrección y marcan todos los registros que no pasan la prueba.

decir

UPDATE staging_table 
SET status_code = 'FAIL_TEST_1' 
WHERE status_code IS NULL 
AND ISDATE(ntext_column1) = 0; 

UPDATE staging_table 
SET status_code = 'FAIL_TEST_2' 
WHERE status_code IS NULL 
AND ISNUMERIC(ntext_column2) = 0; 

etc... 

Finalmente

INSERT INTO results_table (mydate, myprice) 
SELECT ntext_column1 AS mydate, ntext_column2 AS myprice 
FROM staging_table 
WHERE status_code IS NULL; 

DELETE FROM staging_table 
WHERE status_code IS NULL; 

Y la tabla de ensayo tiene todos los errores, que puede exportar e informar a cabo.

2

¿Qué está utilizando para importar el archivo? DTS tiene habilidades de scripting que se pueden usar para la validación de datos. Si no está utilizando DTS, ¿está utilizando una herramienta personalizada? Si es así, haz tu validación allí.

Pero creo que esto es lo que estás buscando.
http://www.sqlteam.com/article/using-dts-to-automate-a-data-import-process

IF @@Error <> 0 
GOTO LABEL 

@op
En SSIS la "línea roja" de una tarea de importación de datos puede redirigir malas filas a un destino por separado o transformar. No he jugado con esto por un tiempo, pero espero que ayude.

1

Parece que está condenado. Vea el documento this.

TL/DR: Un error de conversión de datos siempre causa la interrupción del lote completo: su script sql no continuará ejecutándose sin importar lo que haga. Las transacciones no ayudarán. No puede marcar @@ ERROR porque la ejecución ya habrá abortado.

En primer lugar, volvería a examinar por qué necesita una base de datos provisional con varias columnas (255). ¿Puede completar la conversión lo que llena esa base de datos?

Si no, supongo que tendrá que escribir un programa/script para seleccionar de entre las columnas varchar, convertir e insertar en el prod db.

1

Ejecutar cada conversión en una transacción, después de cada lanzamiento, marque @@ ERROR, si es claro, confirme y continúe.

1

Puede intentar comprobar el tipo de datos antes de transmitir y evitar los errores de lanzamiento.

Usted podría utilizar funciones como:

 
ISNUM - to check if the data is of a numeric type 
ISDATE - to check if it can be cast to DATETIME