从1-9增加,然后在SQL中增加A-Z

时间:2018-04-11 13:59:00

标签: sql sql-server

我正在创建一个长度为11个字符的唯一标识符。我想要做的是从00000000001开始转到00000000009然后在我点击Z之后以0000000000A到0000000000Z开始然后我将使用下一列00000000011到00000000019然后0000000001A到000000000001Z。我将如何实现这一目标?我知道如何分别增加字母和数字,但我怎么把它们放在一起呢?

4 个答案:

答案 0 :(得分:1)

正如Alex K.所说,在表格中使用IDENTITY(1,1)作为主键,并使用以下内容计算疯狂基数36的值:

declare @Val BIGINT

    set @val = 45643

    DECLARE @Result VARCHAR(9) = ''


    WHILE (@Val > 0)
    BEGIN
        SELECT @Result = CHAR(@Val % 36 + CASE WHEN @Val % 36 < 10 THEN 48 ELSE 55 END) + @Result,
               @Val = FLOOR(@Val/36)
    END

    select right('00000000000' + @Result, 11)

此处的代码:https://gist.github.com/Plutor/2511071

或者,您可以使用以下内容生成值:

with a as (
        select  i
        from    (values('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9'),('A'),('B'),('C')) v(i)
)
select  a1.i + a2.i + a3.i + a4.i Value,
        row_number() over(order by a1.i + a2.i + a3.i + a4.i) rn
from    a a1, a a2, a a3, a a4

答案 1 :(得分:0)

我碰巧有一个base 35编码功能。对于基地36来说,不应该太难采用它:

IF OBJECT_ID('DCA.dxConvert_From_Decimal_To_35Base') IS NOT NULL
BEGIN
    DROP FUNCTION [DCA].[dxConvert_From_Decimal_To_35Base]
END
GO

CREATE FUNCTION DCA.dxConvert_From_Decimal_To_35Base(@DECIMAL_NUMBER INT)
RETURNS VARCHAR(20)
AS
BEGIN
    DECLARE @MOD INT
    DECLARE @TEMP_VALUE VARCHAR(20) 
    DECLARE @BASE_DIGITS VARCHAR(100)
    DECLARE @BASE INT

    SET @BASE = 35
    SET @TEMP_VALUE = ''
    SET @BASE_DIGITS = '0123456789ABCDEFGHIJKLMNPQRSTUVWXYZ'

    IF @DECIMAL_NUMBER = 0 
    BEGIN --0 STAYS 0
        RETURN 0
    END 

    WHILE @DECIMAL_NUMBER <> 0
    BEGIN
        SET @MOD = @DECIMAL_NUMBER % @BASE
        SET @TEMP_VALUE = SUBSTRING(@BASE_DIGITS, @MOD + 1 ,  1) + @TEMP_VALUE
        SET @DECIMAL_NUMBER = @DECIMAL_NUMBER / @BASE
    END 

    RETURN @TEMP_VALUE
END

测试用例:

SELECT  SV.number, dca.dxConvert_From_Decimal_To_35Base(SV.number)
FROM    master..spt_values AS SV
WHERE   SV.type = 'P'

结果:

+--------+------------------+
| number | (No column name) |
+--------+------------------+
|      0 | 0                |
|      1 | 1                |
|      2 | 2                |
|      3 | 3                |
|      4 | 4                |
|      5 | 5                |
|      6 | 6                |
|      7 | 7                |
|      8 | 8                |
|      9 | 9                |
|     10 | A                |
|     11 | B                |
|     12 | C                |
|     13 | D                |
|     14 | E                |
|     15 | F                |
|     16 | G                |
|     17 | H                |
|     18 | I                |
|     19 | J                |
|     20 | K                |
|     21 | L                |
|     22 | M                |
|     23 | N                |
|     24 | P                |
|     25 | Q                |
|     26 | R                |
|     27 | S                |
|     28 | T                |
|     29 | U                |
|     30 | V                |
|     31 | W                |
|     32 | X                |
|     33 | Y                |
|     34 | Z                |
|     35 | 10               |
|     36 | 11               |
|     37 | 12               |
+--------+------------------+

答案 2 :(得分:0)

您可以将整数转换为十六进制,然后添加&#39; 000 ...&#39;

DECLARE @t TABLE (value VARCHAR(11));

DECLARE @seq int;
SET @seq = 0;

WHILE @seq < 100
BEGIN

    INSERT INTO @t VALUES
    (
        RIGHT(REPLICATE('0', 11) + sys.fn_varbintohexsubstring(0, @seq, 1, 0), 11)
    );
    SET @seq += 1;

END

SELECT * FROM @t;
| value       |
| :---------- |
| 00000000000 |
| 00000000001 |
| 00000000002 |
| 00000000003 |
| 00000000004 |
| 00000000005 |
| 00000000006 |
| 00000000007 |
| 00000000008 |
| 00000000009 |
| 0000000000a |
| 0000000000b |
| 0000000000c |
| 0000000000d |
| 0000000000e |
| 0000000000f |
| 00000000010 |
| 00000000011 |
| 00000000012 |
| 00000000013 |
| 00000000014 |
| 00000000015 |
| 00000000016 |
| 00000000017 |
| 00000000018 |
| 00000000019 |
| 0000000001a |
| 0000000001b |
| 0000000001c |
| 0000000001d |
| 0000000001e |
| 0000000001f |
| 00000000020 |
| 00000000021 |
| 00000000022 |
| 00000000023 |
| 00000000024 |
| 00000000025 |
| 00000000026 |
| 00000000027 |
| 00000000028 |
| 00000000029 |
| 0000000002a |
| 0000000002b |
| 0000000002c |
| 0000000002d |
| 0000000002e |
| 0000000002f |
| 00000000030 |
| 00000000031 |
| 00000000032 |
| 00000000033 |
| 00000000034 |
| 00000000035 |
| 00000000036 |
| 00000000037 |
| 00000000038 |
| 00000000039 |
| 0000000003a |
| 0000000003b |
| 0000000003c |
| 0000000003d |
| 0000000003e |
| 0000000003f |
| 00000000040 |
| 00000000041 |
| 00000000042 |
| 00000000043 |
| 00000000044 |
| 00000000045 |
| 00000000046 |
| 00000000047 |
| 00000000048 |
| 00000000049 |
| 0000000004a |
| 0000000004b |
| 0000000004c |
| 0000000004d |
| 0000000004e |
| 0000000004f |
| 00000000050 |
| 00000000051 |
| 00000000052 |
| 00000000053 |
| 00000000054 |
| 00000000055 |
| 00000000056 |
| 00000000057 |
| 00000000058 |
| 00000000059 |
| 0000000005a |
| 0000000005b |
| 0000000005c |
| 0000000005d |
| 0000000005e |
| 0000000005f |
| 00000000060 |
| 00000000061 |
| 00000000062 |
| 00000000063 |

dbfiddle here

答案 3 :(得分:0)

如果你愿意使用hex,那么可以使用计算列

USE [Test]
GO

/****** Object:  Table [dbo].[hexRep]    Script Date: 4/11/2018 9:52:44 AM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[hexRep](
    [iden] [int] IDENTITY(1,1) NOT NULL,
    [hex]  AS (CONVERT([char](8),CONVERT([varbinary](8),[iden]),(2))),
    [val] [varchar](50) NULL
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO