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

#1 Maxi
15/11/2005 - 13:46 | Informe spam
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
#2 Maxi
15/11/2005 - 15:06 | Informe spam
Hola, te entiendo pero yo no usaria un cursor, veria la forma de pasar la
data de otra manera. Para esto se necesitaria mas informacion.


Salu2
Maxi [MVP SQL SERVER]


"leocharrua" escribió en el mensaje
news:
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
#3 leocharrua
15/11/2005 - 16:03 | Informe spam
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
#4 Alejandro Mesa
15/11/2005 - 16:28 | Informe spam
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
#5 leocharrua
16/11/2005 - 00:56 | Informe spam
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
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida