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

Preguntas similare

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



Respuesta Responder a este mensaje
#2 Jose TH >>
13/02/2009 - 00:39 | Informe spam
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
Respuesta Responder a este mensaje
#3 José Mª Fueyo
13/02/2009 - 09:46 | Informe spam
Gracias Jose
Era eso. Nunca me acostaré sin aprender una cosa más ¡y de SQL Server tengo
mucho que aprender!

Salu2
José Mª Fueyo
Respuesta Responder a este mensaje
#4 Jose Mariano Alvarez
16/02/2009 - 07:58 | Informe spam
Como te comente en privado te paso un ejmplo

Use Pruebas
go

Create table dbo.RegistroContador(
Abreviatura varchar(4) Primary Key clustered,
Contador int
)
go

create procedure dbo.ProximoId(
@Abreviatura varchar(4),
@Id Varchar(20) output
)
AS
declare @nro int
SET NOCOUNT OFF
Update dbo.RegistroContador
SET @nro = Contador = Contador+ 1
where Abreviatura = @Abreviatura
If @@Rowcount = 0
BEGIN
SET @nro = 1
Insert into dbo.RegistroContador(Abreviatura,Contador)
Values(@Abreviatura,@nro)
END
set @Id = @Abreviatura+right('0000000000000000' + Ltrim(cast(@nro as
varchar(10))), 16)
return 0
GO



SET TRANSACTION ISOLATION LEVEL READ COMMITTED
SET XACT_ABORT ON
declare @id varchar(20)

Select * from dbo.RegistroContador

Begin tran
exec dbo.ProximoId 'ABC',@Id output
select @Id
Select * from dbo.RegistroContador
commit tran
Begin tran
exec dbo.ProximoId 'ABC',@Id output
select @Id
Select * from dbo.RegistroContador
commit tran
Begin tran
exec dbo.ProximoId 'ABC',@Id output
select @Id
Select * from dbo.RegistroContador
commit tran
go

DROP procedure dbo.ProximoId
GO
DROP table dbo.RegistroContador
GO




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.










"José Mª Fueyo" wrote in message
news:
Gracias Jose
Era eso. Nunca me acostaré sin aprender una cosa más ¡y de SQL Server
tengo
mucho que aprender!

Salu2
José Mª Fueyo
Respuesta Responder a este mensaje
#5 José Mª Fueyo
17/02/2009 - 21:07 | Informe spam
Gracias Jose

Salu2
José Mª Fueyo
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida