自定义数字序列格式

时间:2016-10-03 09:13:03

标签: sql-server-2008 tsql sequence number-formatting

我正在使用的系统有一个编号系统,其中数字0-999由通常0-999表示,但1000A00表示,后跟{ {1}},A01A02等,A031100等。

我无法想出一种在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 3E7999

目前产生这个:

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中使用它。

1 个答案:

答案 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.问题并没有说明应该用更大的数字做什么