我正在使用的系统有一个编号系统,其中数字0-999
由通常0-999
表示,但1000
由A00
表示,后跟{ {1}},A01
,A02
等,A03
为1100
等。
我无法想出一种在T-SQL中处理这种方法的方法,而无需使用大量的case语句来检查各个数字,并且必须有更好的方法。我曾考虑使用十六进制,但那不对。
B00
现在DECLARE @startint int = 1,
@endint int = 9999;
;WITH numbers(num)
AS
(
SELECT @startint AS num
UNION ALL SELECT num+1 FROM numbers
WHERE num+1 <= @endint
)
SELECT num, convert(varbinary(8), num) FROM [numbers] N
OPTION(MAXRECURSION 0)
999
3E7
,999
。
目前产生这个:
Number Sequence
0 0x00000000
1 0x00000001
...
10 0x0000000A
...
100 0x00000064
...
999 0x000003E7
1000 0x000003E8
我在寻找:
Number Sequence
0 000
1 001
...
10 010
11 011
12 012
...
999 999
1000 A00
1001 A01
...
1099 A99
1100 B00
1101 B01
1200 C00
我需要在SQL Server 2008中使用它。
答案 0 :(得分:0)
您可以使用整数除法和模数将数百个部分与数字分开。
之后,您可以向商添加64以获得从A
开始的ASCII值。
create function function dbo.fn_NumToThreeLetters(@num integer)
RETURNS nchar(3)
AS
begin
RETURN (SELECT (case
when @num/1000 >0 then
CHAR(( (@num-900)/100) +64)
+ replace(cast( @num %100 as nchar(2)),' ','0')
else cast(@num as nvarchar(3))
end)
)
END
select dbo.fn_NumToThreeLetters(1100)
-------
B00
select dbo.fn_NumToThreeLetters(999)
-------
999
第一个when
子句确保仅在数字大于1000时才应用转换。如果是,则减去900然后除以100,因此我们得到一个从1开始为1000的数字,2为1100等。
为它添加64以从A开始获取ASCII并将其转换回CHAR
的字符。
剩余部分只需要转换为2位数的nchar,其中空格将替换为0
。
这最多只能达到3500.问题并没有说明应该用更大的数字做什么