自定义数字序列格式

Custom number sequence formatting

我正在使用的系统有一个编号系统,其中数字 0-999 由通常的 0-999 表示,但 1000A00 表示,后跟通过 A01A02A03 等,1100 成为 B00

我想不出一种方法来在 T-SQL 中处理这个问题而不诉诸于使用巨大的 case 语句检查单个数字,并且必须有比这更好的方法。我曾考虑过使用十六进制,但那是不对的。

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 中工作。

您可以使用整数除法和取模来将百位和十位分开。 之后,您可以将商加 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。问题没有具体说明应该如何处理更大的数字