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