Ayuda con procedimiento almacenado

12/02/2009 - 18:46 por José Mª Fueyo | Informe spam
Hola a todos.
A ver, estoy creando un procedimiento para insertar registros en una tabla.
La clave primaria es un varchar de 20 posiciones de las cuales las 4 primeras
por la izquierda es una abreviatura, y las 16 siguientes un número
consecutivo (1, 2, 3...) completado con ceros por la izquierda.
Sí existe un registro de la abreviatura no hay problema, crea el segundo.
Pero sí es el primero que crea al serie, intenta generar una clave nula y
claro, da error.
¿Me podeis decir que es lo que hago mal? os dejo aquí el código.

<pego>
CREATE procedure prueba(@Abreviatura varchar(4)) as
Declare @sContador varchar(20), @iContador integer

Select @sContador=substring(max(IdOperacionWS),5,16)
from LogTx
where IdOperacionWS like @Abreviatura +'%'

if @sContador IS NULL
select @sContador=@Abreviatura+ '0000000000000001'
Else
Select @iContadorÊST(@sContador as integer)+1
select @sContador=@Abreviatura+right('0000000000000000' +
cast(@iContador as varchar), 16)

INSERT INTO LogTx(IdOperacionWS) values(@sContador)
GO
</pego>

He de decir que probado de todo: el uso de IsNull, concatenar una cadena
vacía, etc...estoy francamente desesperado (¿será la hora? jeje)
Gracias

Salu2
..
José Mª Fueyo
 

Leer las respuestas

#1 Jose Mariano Alvarez
13/02/2009 - 00:34 | Informe spam
Ademas de el error parece ser el que te comentan, el rendimiento de eso que
intenta hacer va a ser cada ves peor a medida que se agreguen registros.
Te sugiero que guardes una tabla de numeradores.



Saludos


Ing. Jose Mariano Alvarez
SQLTotal Consulting

(Cambia los ceros por O y saca lo que sobra)

Este mensaje se proporciona tal como es, SIN GARANTIAS de ninguna clase. Por
favor tratar de indicar la versión de SQL y Service Pack. La inclusión de
(CREATE, INSERTS, etc.) para poder reproducir el problema también ayuda.










"Jose TH >>" wrote in message
news:
No me he metido en "la lógica" pero por simple inspección imagino que
debes poner un Begin.. End después del Else:

..
if @sContador IS NULL
select @sContador=@Abreviatura+ '0000000000000001'
Else
Begin
Select @iContadorÊST(@sContador as integer)+1
select @sContador=@Abreviatura+right('0000000000000000' +
cast(@iContador as varchar), 16)
End
INSERT INTO LogTx(IdOperacionWS) values(@sContador)


Por cierto, no habrá también demasiados ceros para un integer?



"José Mª Fueyo" wrote in message
news:
Hola a todos.
A ver, estoy creando un procedimiento para insertar registros en una
tabla.
La clave primaria es un varchar de 20 posiciones de las cuales las 4
primeras
por la izquierda es una abreviatura, y las 16 siguientes un número
consecutivo (1, 2, 3...) completado con ceros por la izquierda.
Sí existe un registro de la abreviatura no hay problema, crea el segundo.
Pero sí es el primero que crea al serie, intenta generar una clave nula y
claro, da error.
¿Me podeis decir que es lo que hago mal? os dejo aquí el código.

<pego>
CREATE procedure prueba(@Abreviatura varchar(4)) as
Declare @sContador varchar(20), @iContador integer

Select @sContador=substring(max(IdOperacionWS),5,16)
from LogTx
where IdOperacionWS like @Abreviatura +'%'

if @sContador IS NULL
select @sContador=@Abreviatura+ '0000000000000001'
Else
Select @iContadorÊST(@sContador as integer)+1
select @sContador=@Abreviatura+right('0000000000000000' +
cast(@iContador as varchar), 16)

INSERT INTO LogTx(IdOperacionWS) values(@sContador)
GO
</pego>

He de decir que probado de todo: el uso de IsNull, concatenar una cadena
vacía, etc...estoy francamente desesperado (¿será la hora? jeje)
Gracias

Salu2
..
José Mª Fueyo



Preguntas similares