Ik heb de conversie kunnen maken. Het lastige is dat het niet alleen een conversie met gemengde grondtalen is, de hogere grondtal van het eerste teken heeft ook invloed op de waarden van langere codes.
Ik begon met een eenvoudiger geval; basis-10-codes. Ik zag dat het tweecijferige bereik 10 extra codes heeft, het driecijferige bereik 100 extra codes, enzovoort:
0 - 9 : '0' - '9'
10 - 109 : '00' - '99'
110 - 1109 : '000' - '999'
1110 - 11109 : '0000' - '9999'
De waarde van het eerste teken in de code is dus niet alleen de basis die naar de positie wordt verhoogd, maar heeft ook een offset.
Nadat ik dit had toegepast op de base-62-codering, kreeg ik dit:
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