Успях да направя преобразуването. Трудното е, че това не е просто преобразуване със смесена основа, по-високата основа на първия знак също влияе върху стойностите на по-дългите кодове.
Започнах с по-лесен случай; базови 10 кодове. Видях, че двуцифреният диапазон има 10 допълнителни кода, трицифреният диапазон има 100 допълнителни кода и т.н.:
0 - 9 : '0' - '9'
10 - 109 : '00' - '99'
110 - 1109 : '000' - '999'
1110 - 11109 : '0000' - '9999'
И така, стойността на първия знак в кода не е само основата, повдигната до позицията, но има и отместване.
След като приложих това към кодирането base-62, ето какво получих:
create function tiny_Encode(@UrlId int) returns varchar(10)
as
begin
declare
@Chars varchar(62),
@Code varchar(10),
@Value int,
@Adder int
set @Chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
if (@UrlId < 63) begin
set @Code = substring(@Chars, @UrlId, 1)
end else begin
set @UrlId = @UrlId - 1
set @Value = 62
set @Adder = 0
while (@UrlId >= @Value * 63 + @Adder) begin
set @Adder = @Adder + @Value
set @Value = @Value * 62
end
set @Code = substring(@Chars, (@UrlId - @Adder) / @Value, 1)
set @UrlId = ((@UrlId - @Adder) % @Value)
while (@Value > 1) begin
set @Value = @Value / 62
set @Code = @Code + substring(@Chars, @UrlId / @Value + 1, 1)
set @UrlId = @UrlId % @Value
end
end
return @Code
end