论坛上有人提出用36进制进行加法运算,而且要求一定得用 SQL 语句写,其36进制即采用0-9,a-z这36个符号表示数值,试着写了玩儿:
--创建字符转换为数值的函数
create function cton36
(@s varchar(12))
returns bigint
as
begin
declare @n bigint
set @s=upper(@s)
select @n=isnull(@n,0)+
(case when ascii(right(@s,number+1))>=65 then ascii(right(@s,number+1))-55 else ascii(right(@s,number+1))-48 end)*power(convert(bigint,36),number)
from master..spt_values where type='p' and number<len(@s)
return @n
end
go
--创建数值到字符的转换函数
create function ntoc36
(@n bigint)
returns varchar(12)
as
begin
declare @s varchar(12)
set @s=''
while @n>0
begin
set @s=char(case when @n%36<10 then 48+@n%36 else 55+@n%36 end)+@s
set @n=@n/36
end
return @s
end
go
--运算
select dbo.ntoc36(dbo.cton36('f87q3jds9')+dbo.cton36('437dz'))
/*
------------
F87Q7ML68
(1 行受影响)
*/
go
--删除自定义函数
drop function dbo.cton36,dbo.ntoc36
--说明:受 bigint 最大数值的限制,上述转换字符数最长不超过 12 位.
因为bigint数据类型最多只能容纳'zzzzzzzzzzzz'转换的值,再大就溢出了(并不会提示出错),因此上述转换如果位数大的话,不能相乘再转回去。当然数值小的时候是可以的。