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