Como hacer que no se detenga la ejecución ante un error?

14/04/2009 - 16:27 por Pedro J. Reguera | Informe spam
Hola:

¿existe algo parecido al on error en TSQL para que siga ejecutándose una
instrucción de carga masiva aunque se produzca un error?.
Me explico, simplificando mucho tengo que hacer un INSERT INTO
tabla1(campo11, campo12, campo13) SELECT FROM
tabla2(campo21,campo22,campo23).
El caso es que en tabla1 hay una clave NO duplicada que es campo11+campo12 y
el SELECT de tabla2 me devuelve registros con valores iguales en campo21 y
campo22. Lo que quiero es que estos registros lógicamente, al estar
duplicados no se inserten en la tabla1, pero el resto si. Lo que ocurre
ahora es que en cuanto llega a un registro con valor duplicado el proceso se
para.
Por favor, no decirme que haga un GROUP BY en tabla2 para evitar los
duplicados, como digo esto está simplificado y el SELECT origen de los datos
por su complejidad no es susceptible de hacer un GROUP BY.

Gracias y un saludo.
Pedro J.

Preguntas similare

Leer las respuestas

#1 Carlos Sacristan
14/04/2009 - 16:55 | Informe spam
Mmm... lo veo complicado. Veo tres opciones: o bien deshabilitas las
restricciones que tengas en tabla1 para que no lance ningún error y luego
ejecutes un proceso de "limpieza" de datos (eliminando duplicados por
ejemplo) o bien vayas fila a fila para que el proceso de validación se haga
antes del insert y no tengas que tocar la tabla destino. Otra opción es
realizar las validaciones "a mano" en una tabla temporal (te recomiendo
hacerlo mediante SELECT... INTO porque es una operación que puede ser
mínimamente registrada) y luego hacer el insert en la tabla final con los
datos ya correctos.

Cualquiera de las opciones te permite no modificar la consulta original, que
es la premisa que querías cumplir

Probablemente sea más eficiente la tercera opción, pero es algo que deberás
validar en tu entorno.
"Caminar sobre el agua y desarrollar software a partir de unas
especificaciones es fácil. si ambas están congeladas."
Edward V. Berard, ingeniero informático

http://blogs.solidq.com/es/elrincondeldba

"Pedro J. Reguera" escribió en el mensaje
news:
Hola:

¿existe algo parecido al on error en TSQL para que siga ejecutándose una
instrucción de carga masiva aunque se produzca un error?.
Me explico, simplificando mucho tengo que hacer un INSERT INTO
tabla1(campo11, campo12, campo13) SELECT FROM
tabla2(campo21,campo22,campo23).
El caso es que en tabla1 hay una clave NO duplicada que es campo11+campo12
y el SELECT de tabla2 me devuelve registros con valores iguales en campo21
y campo22. Lo que quiero es que estos registros lógicamente, al estar
duplicados no se inserten en la tabla1, pero el resto si. Lo que ocurre
ahora es que en cuanto llega a un registro con valor duplicado el proceso
se para.
Por favor, no decirme que haga un GROUP BY en tabla2 para evitar los
duplicados, como digo esto está simplificado y el SELECT origen de los
datos por su complejidad no es susceptible de hacer un GROUP BY.

Gracias y un saludo.
Pedro J.


Respuesta Responder a este mensaje
#2 Alejandro Mesa
14/04/2009 - 17:35 | Informe spam
Pedro J. Reguera,

1 - Puedes alterar la restriccion en la tabla 1 para que no inserte
duplicados. chequea los BOL y busca el topico sobre "create table", "create
index" y como usar la opcion IGNORE_DUP_KEY.

2 - Puedes alterar la sentencia e insertar solo filas que cumpla que no
existan en tabla 1.

; with r_set
as
(
select
c21, c22, ..., cn,
row_number() over(partition by c21, c22 order by (select 1)) as rn
from tabla2
)
insert into tabla1(c11, c12, ..., cn)
select c21, c22, ..., cn
from r_set as a
where rn = 1 and not exists (
select *
from tabla1 as b
where b.c11 = a.c21 and b.c12 = a.c22
);
go


AMB


"Pedro J. Reguera" wrote:

Hola:

existe algo parecido al on error en TSQL para que siga ejecutndose una
instruccin de carga masiva aunque se produzca un error?.
Me explico, simplificando mucho tengo que hacer un INSERT INTO
tabla1(campo11, campo12, campo13) SELECT FROM
tabla2(campo21,campo22,campo23).
El caso es que en tabla1 hay una clave NO duplicada que es campo11+campo12 y
el SELECT de tabla2 me devuelve registros con valores iguales en campo21 y
campo22. Lo que quiero es que estos registros lgicamente, al estar
duplicados no se inserten en la tabla1, pero el resto si. Lo que ocurre
ahora es que en cuanto llega a un registro con valor duplicado el proceso se
para.
Por favor, no decirme que haga un GROUP BY en tabla2 para evitar los
duplicados, como digo esto est simplificado y el SELECT origen de los datos
por su complejidad no es susceptible de hacer un GROUP BY.

Gracias y un saludo.
Pedro J.


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida