Ayuda funcion

27/02/2009 - 22:02 por cpb.sos | Informe spam
Amigos estoy realizadondo unas pruebas que implican operaciones con
números grandes

He desarrollado una función para multiplicar.

Pueden probar el ejmplo de abajo y la operación la realiza con
bastante rapidez.
Sin embargo cuando la ejecuto con datos de una base de una tabla, el
proceso se va haciendo demasiado lento.

Espero que alguno de ustedes me ayude a crear una dll con la función y
posteriormente ejecutarla desde SQL,

/*ejemplo
print dbo.multiplicar
('1634733645809253848443133883865090859841783670033092312181110852389333100104508151212118167511579',
'1900871281664822113126851573935413975471896789968515493666638539088027103802104498957191261465571')
3107418240490043721350750035888567930037346022842727545720161948823206440518081504556346829671723286782437916272838033415471073108501919548529007337724822783525742386454014691736602477652346609
*/

CREATE function multiplicar
(@a varchar(500), @b varchar(500))
returns varchar(1024)

as
begin

declare @t table (id int identity(1, 1), n1 varchar(500))
declare @i int,
@j int,
@l bigint,
@p bigint,
@m bigint,
@n bigint,
@x char(1),
@s varchar(1024)

set @a = replicate('0', case when len(@a) % 6 = 0 then 0 else 6 - len
(@a) % 6 end) + @a
set @b = replicate('0', case when len(@b) % 6 = 0 then 0 else 6 - len
(@b) % 6 end) + @b


set @i = len(@b) - 5
while @i >= 1
begin
set @s = ''
set @m = substring(@b, @i, 6)
set @j = len(@a) - 5
set @l = 0
while @j >= 1
begin
set @n = substring(@a, @j, 6)
set @p = @m * @n + @l
set @l = @p / 1000000
set @s = right('000000' + convert(varchar, @p), 6) + @s
set @j = @j - 6
end
set @s = convert(varchar, @l) + @s + replicate('0', len(@b) - (@i
+ 5))

insert into @t values(@s)
set @i = @i - 6
end

update @t set n1 = right(replicate('0', len(@a) + len(@b)) + n1, len
(@a) + len(@b))

declare @total varchar(1024)

set @total = ''
set @i = (select max(len(n1)) from @t)
set @l = 0
while @i >= 1
begin
set @p = (select sum(convert(int, substring(n1, @i, 1))) from @t) +
@l
set @total = convert(varchar(1), @p % 10) + @total
set @l = @p / 10
set @i = @i - 1
end
set @total = convert(varchar, @l) + @total

set @x = '0'
set @i = 0
while @x = '0'
begin
set @x = substring(@total, @i+1, 1)
set @i = @i + 1
end
set @total = substring(@total, @i, 1024)
return @total
end
 

Leer las respuestas

#1 Gustavo Larriera [MVP]
27/02/2009 - 22:44 | Informe spam
Le recomiendo que programe la función en .NET y la integre a su base de
datos. Vea el siguiente artículo acerca del tema:

Introducing SQL Server 2005's CLR Integration
http://www.devsource.com/c/a/Using-...tegration/

Gustavo Larriera, Microsoft MVP
http://www.linkedin.com/in/gustavolarriera
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"cpb.sos" wrote:

Amigos estoy realizadondo unas pruebas que implican operaciones con
números grandes

He desarrollado una función para multiplicar.

Pueden probar el ejmplo de abajo y la operación la realiza con
bastante rapidez.
Sin embargo cuando la ejecuto con datos de una base de una tabla, el
proceso se va haciendo demasiado lento.

Espero que alguno de ustedes me ayude a crear una dll con la función y
posteriormente ejecutarla desde SQL,

/*ejemplo
print dbo.multiplicar
('1634733645809253848443133883865090859841783670033092312181110852389333100104508151212118167511579',
'1900871281664822113126851573935413975471896789968515493666638539088027103802104498957191261465571')
3107418240490043721350750035888567930037346022842727545720161948823206440518081504556346829671723286782437916272838033415471073108501919548529007337724822783525742386454014691736602477652346609
*/

CREATE function multiplicar
(@a varchar(500), @b varchar(500))
returns varchar(1024)

as
begin

declare @t table (id int identity(1, 1), n1 varchar(500))
declare @i int,
@j int,
@l bigint,
@p bigint,
@m bigint,
@n bigint,
@x char(1),
@s varchar(1024)

set @a = replicate('0', case when len(@a) % 6 = 0 then 0 else 6 - len
(@a) % 6 end) + @a
set @b = replicate('0', case when len(@b) % 6 = 0 then 0 else 6 - len
(@b) % 6 end) + @b


set @i = len(@b) - 5
while @i >= 1
begin
set @s = ''
set @m = substring(@b, @i, 6)
set @j = len(@a) - 5
set @l = 0
while @j >= 1
begin
set @n = substring(@a, @j, 6)
set @p = @m * @n + @l
set @l = @p / 1000000
set @s = right('000000' + convert(varchar, @p), 6) + @s
set @j = @j - 6
end
set @s = convert(varchar, @l) + @s + replicate('0', len(@b) - (@i
+ 5))

insert into @t values(@s)
set @i = @i - 6
end

update @t set n1 = right(replicate('0', len(@a) + len(@b)) + n1, len
(@a) + len(@b))

declare @total varchar(1024)

set @total = ''
set @i = (select max(len(n1)) from @t)
set @l = 0
while @i >= 1
begin
set @p = (select sum(convert(int, substring(n1, @i, 1))) from @t) +
@l
set @total = convert(varchar(1), @p % 10) + @total
set @l = @p / 10
set @i = @i - 1
end
set @total = convert(varchar, @l) + @total

set @x = '0'
set @i = 0
while @x = '0'
begin
set @x = substring(@total, @i+1, 1)
set @i = @i + 1
end
set @total = substring(@total, @i, 1024)
return @total
end

Preguntas similares