DTS: Como manejar errores en un paso con T-SQL

15/11/2005 - 13:29 por leocharra.news | Informe spam
En un paso de un DTS que sólo contiene instrucciones T-SQL, como se maneja
un error, por ejemplo 2627 (clave duplicada) y así poder reintentar?.
Probé testeando @@ERROR pero nunca llega a esa instrucción, ya que el paso
cancela en la instrucción que da error (en mi caso, el Insert).
Muchas gracias.
Leo

Preguntas similare

Leer las respuestas

#6 Alejandro Mesa
16/11/2005 - 03:51 | Informe spam
leocharrua,

Chequea por la existencia de ese valor en la clave primaria.

if exists (select * from [Contactos] where IdCliente = @IdCliente)
GOTO CONTINUAR
else
INSERT INTO [Contactos]
([IdCliente], [SecFinca], [SecContacto], [Telefono], [Nombre],
[NroDocumento], [TipoDocumento], [FechaNacimiento],
[Descripcion], [Clave], [IndLlave], [IndLlamarPorDesactivacion],
[IndAutoDiscado], [Usuario])
VALUES( @IdCliente, @SecFinca, @SecContacto, '', @Nombre, @NroDocumento,
@TipoDocumento, @FechaNacimiento, '', '', 0, 0, 0, '_ADMIN')

...


AMB

"leocharrua" wrote:

Creé un procedimiento almacenado con el código T-SQL y se comporta
exactamente como antes, cancela con error 2627 (clave duplicada).
Adjunto la parte del código donde manejo el error (ahora dentro de un SP):

INSERT INTO [Contactos]

([IdCliente], [SecFinca], [SecContacto], [Telefono], [Nombre],
[NroDocumento], [TipoDocumento], [FechaNacimiento],

[Descripcion], [Clave], [IndLlave], [IndLlamarPorDesactivacion],
[IndAutoDiscado], [Usuario])

VALUES( @IdCliente, @SecFinca, @SecContacto, '', @Nombre, @NroDocumento,
@TipoDocumento, @FechaNacimiento,

'', '', 0, 0, 0, '_ADMIN')

SET @Err = @@ERROR


duplicate key in object 'Contactos'.

IF @Err = 2627 BEGIN


SET @Err = 0

GOTO CONTINUAR

END

IF @Err > 0 GOTO Error_Handler

Donde CONTINUAR es la etiqueta que tengo justo antes del END del WHILE que
uso para recorrer el cursor, y Error_Handler es la etiqueta que tengo al
final del SP para manejar los errores (ROLLBACK y RAISEERROR).

Alguna otra idea?

Muchas gracias.

Leo



"Alejandro Mesa" escribió en el
mensaje news:
leocharrua,

1 - En vez de escribir todo el codigo t-sql en la tarea, usa un
procedimiento almacenado y ejecuta el sp en la tarea

2 - En vez de insertar / incrementar y manejar el error, chequea primero si
la clave existe y base a la existencia entonces incrementas o pones 1 o lo
que toque.


AMB

"leocharrua" wrote:

> Te cuento el problema en concreto:
>
> Estoy procesando un conjunto de registros de una tabla con un cursor,
> insertando en otra.
> Tengo que hacerlo con un cursor, ya que en la tabla destino tengo un Nro.
> de
> Secuencia que debo ir incrementando cuando tengo la misma clave.
> El problema es que puede que existan registros para esa clave ya que la
> idea
> es intentar con las secuencia 1 e incrementar en caso de que exista (para
> que no queden huecos).
> Por eso mi idea era detectar el error 2627 (clave duplicada), incrementar
> la
> secuencia y reintentar el insert.
> Ejemplo:
>
> Tabla origen:
>
> Cliente Dato
> 1 hola
> 1 como estas
> 2 otro dato
>
> Tabla destino:
>
>
> Cliente Secuencia Dato
> 1 1 hola
> 1 2 como estas
> 2 1 otro dato
>
> Provisoriamente, lo resolví calculando antes del insert la max(secuencia)
> y
> empezar a numerar desde ese número para evitar duplicados, pero me quedan
> huecos, cosa que tengo que evitar.
> No veo muy clara la idea de separar en varios pasos en mi caso concreto.
> Alguna idea?.
> Gracias.
>
>
> "Maxi" escribió en el mensaje
> news:%
> Hola, en los paquetes DTS tienes lo que se llama flujo, o sea, vos podrias
> definir que si el paso A dio error vaya a tal o cual lado. No se bien
> como
> esta armando el paquete DTS, pero si haces un INSERT into SELECT y ahi te
> dio error entonces yo te recomendaria que cambies la TSQL y solo hagas los
> insert de los registros que no existen, asi te evitas problemas. :-)
>
>
> Salu2
> Maxi [MVP SQL SERVER]
>
>
> "leocharra.news" escribió en el mensaje
> news:
> > En un paso de un DTS que sólo contiene instrucciones T-SQL, como se
> > maneja
> > un error, por ejemplo 2627 (clave duplicada) y así poder reintentar?.
> > Probé testeando @@ERROR pero nunca llega a esa instrucción, ya que el
> > paso
> > cancela en la instrucción que da error (en mi caso, el Insert).
> > Muchas gracias.
> > Leo
> >
> >
> >
>
>
>
>



Respuesta Responder a este mensaje
#7 leocharrua
16/11/2005 - 16:14 | Informe spam
Entiendo la idea y seguro va a funcionar, pero lo que no entiendo es como no
existe en los DTS la posibilidad de manejar errores "elegantemente" dentro
de un paso.
Muchas gracias y esperemos que en la versión 2005 esté mejorado este
aspecto.
Leo

"Alejandro Mesa" escribió en el
mensaje news:
leocharrua,

Chequea por la existencia de ese valor en la clave primaria.

if exists (select * from [Contactos] where IdCliente = @IdCliente)
GOTO CONTINUAR
else
INSERT INTO [Contactos]
([IdCliente], [SecFinca], [SecContacto], [Telefono], [Nombre],
[NroDocumento], [TipoDocumento], [FechaNacimiento],
[Descripcion], [Clave], [IndLlave], [IndLlamarPorDesactivacion],
[IndAutoDiscado], [Usuario])
VALUES( @IdCliente, @SecFinca, @SecContacto, '', @Nombre, @NroDocumento,
@TipoDocumento, @FechaNacimiento, '', '', 0, 0, 0, '_ADMIN')

...


AMB

"leocharrua" wrote:

Creé un procedimiento almacenado con el código T-SQL y se comporta
exactamente como antes, cancela con error 2627 (clave duplicada).
Adjunto la parte del código donde manejo el error (ahora dentro de un SP):

INSERT INTO [Contactos]

([IdCliente], [SecFinca], [SecContacto], [Telefono], [Nombre],
[NroDocumento], [TipoDocumento], [FechaNacimiento],

[Descripcion], [Clave], [IndLlave], [IndLlamarPorDesactivacion],
[IndAutoDiscado], [Usuario])

VALUES( @IdCliente, @SecFinca, @SecContacto, '', @Nombre, @NroDocumento,
@TipoDocumento, @FechaNacimiento,

'', '', 0, 0, 0, '_ADMIN')

SET @Err = @@ERROR


duplicate key in object 'Contactos'.

IF @Err = 2627 BEGIN


SET @Err = 0

GOTO CONTINUAR

END

IF @Err > 0 GOTO Error_Handler

Donde CONTINUAR es la etiqueta que tengo justo antes del END del WHILE que
uso para recorrer el cursor, y Error_Handler es la etiqueta que tengo al
final del SP para manejar los errores (ROLLBACK y RAISEERROR).

Alguna otra idea?

Muchas gracias.

Leo



"Alejandro Mesa" escribió en el
mensaje news:
leocharrua,

1 - En vez de escribir todo el codigo t-sql en la tarea, usa un
procedimiento almacenado y ejecuta el sp en la tarea

2 - En vez de insertar / incrementar y manejar el error, chequea primero
si
la clave existe y base a la existencia entonces incrementas o pones 1 o lo
que toque.


AMB

"leocharrua" wrote:

> Te cuento el problema en concreto:
>
> Estoy procesando un conjunto de registros de una tabla con un cursor,
> insertando en otra.
> Tengo que hacerlo con un cursor, ya que en la tabla destino tengo un
> Nro.
> de
> Secuencia que debo ir incrementando cuando tengo la misma clave.
> El problema es que puede que existan registros para esa clave ya que la
> idea
> es intentar con las secuencia 1 e incrementar en caso de que exista
> (para
> que no queden huecos).
> Por eso mi idea era detectar el error 2627 (clave duplicada),
> incrementar
> la
> secuencia y reintentar el insert.
> Ejemplo:
>
> Tabla origen:
>
> Cliente Dato
> 1 hola
> 1 como estas
> 2 otro dato
>
> Tabla destino:
>
>
> Cliente Secuencia Dato
> 1 1 hola
> 1 2 como estas
> 2 1 otro dato
>
> Provisoriamente, lo resolví calculando antes del insert la
> max(secuencia)
> y
> empezar a numerar desde ese número para evitar duplicados, pero me
> quedan
> huecos, cosa que tengo que evitar.
> No veo muy clara la idea de separar en varios pasos en mi caso concreto.
> Alguna idea?.
> Gracias.
>
>
> "Maxi" escribió en el mensaje
> news:%
> Hola, en los paquetes DTS tienes lo que se llama flujo, o sea, vos
> podrias
> definir que si el paso A dio error vaya a tal o cual lado. No se bien
> como
> esta armando el paquete DTS, pero si haces un INSERT into SELECT y ahi
> te
> dio error entonces yo te recomendaria que cambies la TSQL y solo hagas
> los
> insert de los registros que no existen, asi te evitas problemas. :-)
>
>
> Salu2
> Maxi [MVP SQL SERVER]
>
>
> "leocharra.news" escribió en el mensaje
> news:
> > En un paso de un DTS que sólo contiene instrucciones T-SQL, como se
> > maneja
> > un error, por ejemplo 2627 (clave duplicada) y así poder reintentar?.
> > Probé testeando @@ERROR pero nunca llega a esa instrucción, ya que el
> > paso
> > cancela en la instrucción que da error (en mi caso, el Insert).
> > Muchas gracias.
> > Leo
> >
> >
> >
>
>
>
>



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