PDA

Ver la Versión Completa : Problema con Store Procedure en SQL SERVER


Kenlyr
10-03-2007, 21:12:35
Hola, tengo el siguiente Store Procedure en SQL SERVER el cual me convierte de Hexadecimal a Decimal, el problema es el siguiente que este Store Procedure debe de actualizar una tabla conviertiendo las filas del campo Hexadecimal a Decimal pero cuando lo ejecuto dura horas ejecutandose y no actualiza la tabla este es el codigo:

CREATE PROCEDURE [CONVERTIR_HEXADECIMAL]
AS
DBCC CHECKIDENT (Codigos, RESEED, 0)
-----------CONVERTIR SERIE DE HEX-DEC----------------------------
DECLARE @TRECORDS as int ,@ROW as int, @DEC as varchar(20),@Hex char(8),
@Hex1 char(8),@Hex2 char(8),@Longitud int,@counter int,@ch char(1),@num int,
@P int,@DEC1 INT,@DEC2 INT
SET @TRECORDS =(SELECT MAX(Num_FILA) FROM Codigos)
SET @ROW = 1
WHILE @ROW<=@TRECORDS
BEGIN
SET @HEX =(SELECT UPPER(SERIE_HEXADECIMAL) FROM Codigos WHERE Num_FILA=@ROW)
SET @DEC=''
-----------Convertir la primera parte de la serie a Decimal----------------------------
SET @HEX1=SUBSTRING(@HEX,1,2)
SET @Longitud=len(@HEX1)
SET @counter=2
SET @P=0
SET @DEC1 =0
SET @num = 0
WHILE @counter>=1
BEGIN
set @ch = substring(@HEX1,@counter,1)
if @ch = 'A' set @num=10
else
if @ch = 'B' set @num=11
else
if @ch = 'C' set @num=12
else
if @ch = 'D' set @num=13
else
if @ch = 'E' set @num=14
else
if @ch = 'F' set @num=15
else
if @ch between '0' and '9'
set @num =cast(substring(@HEX1,@counter,1) as int)
SET NOCOUNT ON
SET @DEC1 = @DEC1 + @num * POWER(16, @P)
SET @counter = @counter - 1
SET @P=@P+1
SET NOCOUNT OFF
END
-----------Convertir la segunda parte de la serie a Decimal----------------------------
SET @HEX2=SUBSTRING(@HEX,3,6)
SET @Longitud=len(@HEX2)
SET @counter=6
SET @P=0
SET @DEC2 =0
SET @num = 0
WHILE @counter>=1
BEGIN
set @ch = substring(@HEX2,@counter,1)
if @ch = 'A' set @num=10
else
if @ch = 'B' set @num=11
else
if @ch = 'C' set @num=12
else
if @ch = 'D' set @num=13
else
if @ch = 'E' set @num=14
else
if @ch = 'F' set @num=15
else
if @ch between '0' and '9'
set @num =cast(substring(@HEX2,@counter,1) as int)
SET NOCOUNT ON
SET @DEC2 = @DEC2 + @num * POWER(16, @P)
SET @counter = @counter - 1
SET @P=@P+1
SET NOCOUNT OFF
END
if len(@DEC1)< 3
set @DEC = substring('00000000',1,3-len(@DEC1))+cast(@DEC1 AS varchar(3))
else
set @DEC = cast(@DEC1 AS varchar(3))
if len(@DEC2)< 8
set @DEC =@DEC+substring('00000000',1,8-len(@DEC2))+cast(@DEC2 AS varchar(8))
else
set @DEC = @DEC +cast(@DEC2 as varchar(8))
UPDATE Codigos
SET SERIE_DECIMAL=@DEC
WHERE Num_FILA=@ROW
SET @ROW=@ROW + 1
END
GO

Que podria estar sucediendo?? :mad:

sinalocarlos
10-03-2007, 22:33:49
una duda para que utilizas el comando DBCC CHECKIDENT si no insertas nada en el registro?

intentaste debugear el procedimiento? en el query analizer dale F8 (mostrar el object browser) localiza el procedimiento click derecho sobre el y en el pop up a lo ultimo te aparece la opcion de debug asi podras darte cuenta en donde se tarda

a modo de sugerencia: no seria mejor que el procedimiento de convertir a hesadecimal lo pasaras a una funcion que le mandes el string del hexa y te regrese el decimal algo asi como:

Código SQL [-] (http://www.clubdelphi.com/foros/#)CREATE FUNCTION fn_HEXtoDEC (hexa varchar (100)) RETURNS decimal (38,8)


para usar algo como:
Código SQL [-] (http://www.clubdelphi.com/foros/#)UPDATE Codigos SET SERIE_DECIMAL= dbo.fn_HEXtoDEC(SERIE_HEXADECIMAL)



saludos

Kenlyr
10-03-2007, 23:34:18
Gracias Sinalocarlo,
pero una pregunta cuando retorna el valor decimal en la funcion" RETURNS decimal (38,8) que seria esto, el 38,8???, pues la manera como aqui calculamos la serie decimal es tomando de los 8 caracteres de la serie hexadecimal los primeros 2 que equivale a 3 digitos o caracteres decimales y luego los demas que serian los 6 caracteres hexadecimales restantes y que equivaldrian a los 9 caracteres siguientes de la serie decimal pues tenemos un total por default de 11 caracteres para decimal y 8 para hexadecimal.

Realice el Debug y se queda corriendo tambien bastante tiempo lo cual tengo que pararlo sin retorname nada.

Kenlyr
10-03-2007, 23:38:43
Bueno ahora que acabo de abortar el proceso me dice
'@ RETURN_VALUE = n/a' PERO MAS NADA.