Sql 自动生成唯一密钥不一致

Sql 自动生成唯一密钥不一致,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在尝试以以下格式创建唯一密钥: ABC123456 例如,它从ABC000001开始,到ABC99999结束,基本上前三个字符是ABC,然后是6个数字 我目前有以下疑问: SELECT 'ABC' + CAST(REPLICATE('0',6-LEN(RTRIM(ROW_NUMBER() OVER (ORDER BY (SELECT NULL))))+ (SELECT Counter from Counters)) + RTRIM(ROW_NUMBER() OVER (ORDE

我正在尝试以以下格式创建唯一密钥:

ABC123456

例如,它从ABC000001开始,到ABC99999结束,基本上前三个字符是ABC,然后是6个数字

我目前有以下疑问:

  SELECT 
    'ABC' + CAST(REPLICATE('0',6-LEN(RTRIM(ROW_NUMBER() OVER (ORDER BY (SELECT NULL))))+ (SELECT Counter from Counters)) + RTRIM(ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) + (SELECT Counter from Counters)) as CHAR(9)) as InvoiceNumber,
    ID,
    RandomNumber
 from
    RandomNumbers
以下是一些示例数据:

CREATE TABLE [dbo].[Counters](
    [Counter] [int] NULL
) ON [PRIMARY]
INSERT INTO [dbo].[Counters]
           ([Counter])
     VALUES
           (0)

CREATE TABLE [dbo].[RandomNumbers](
    [ID] [int] NULL,
    [RandomNumber] [int] NULL
) ON [PRIMARY]
GO

with randowvalues
    as(
       select 1 id, CAST(RAND(CHECKSUM(NEWID()))*100 as int) randomnumber
        union  all
        select id + 1, CAST(RAND(CHECKSUM(NEWID()))*100 as int)  randomnumber
        from randowvalues
        where 
          id < 1000
      )

Insert into RandomNumbers
(
ID,
RandomNumber
)
select *
from randowvalues
OPTION(MAXRECURSION 0)
然后重新运行主查询,它抛出编号。我做错了什么?

使用
STUFF()
函数:

with
    cte
as
(
    SELECT 
        ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) + (SELECT Counter from Counters) as InvNo,
        ID,
        RandomNumber,
        'ABC000000' as SampleNo
    from
        RandomNumbers
)
select
    stuff(SampleNo, (Len(SampleNo) - Len(InvNo)) + 1, Len(SampleNo), InvNo) as InvoiceNumber,
    ID,
    RandomNumber
from
    cte;

这个怎么样,如果你有一个
IDENTITY
列就更好了

SELECT STUFF('ABC000000',
             10 - LEN( CAST(RN AS VARCHAR) ),
             LEN(CAST(RN AS VARCHAR)),
             CAST(RN AS VARCHAR)
       ) GenKey,
       SomeCols
FROM
(
   SELECT *,
          ROW_NUMBER() OVER(ORDER BY SomeCols) RN --Simulate IDENTITY column if you have one it would be better
   FROM YourTable 
) T;
返回:

+-----------+----------+
|  GenKey   | SomeCols |
+-----------+----------+
| ABC000001 | SomeData |
| ABC000002 | SomeData |
| ABC000003 | SomeData |
| ABC000004 | SomeData |
| ABC000005 | SomeData |
| ABC000006 | SomeData |
| ABC000007 | SomeData |
| ABC000008 | SomeData |
| ABC000009 | SomeData |
| ABC000010 | SomeData |
| …         |          |
+-----------+----------+


如果您已经有了一个
IDENTITY
列,那么最好得到正确的
GenKey
即使是从
YourTable
中删除的一些行,甚至
YourTable
也有超过
999999
行,下面是一个模拟这种情况。

您是如何创建这个数字的?您的公式看起来有点奇怪,
计数器的用途是什么?
?您为什么要这样做?如果您只想生成这样的数字,可以使用序列。如果您想将这样的字段添加到表中,有更好的方法。
行编号
,嗯。可以删除行吗?@Philip。序列具有这些能力。此外,它们由数据库记录和支持。不要再发明轮子了。谢谢@Sami-会测试出来的:)谢谢@Mohammad-会测试出来的。
+-----------+----------+
|  GenKey   | SomeCols |
+-----------+----------+
| ABC000001 | SomeData |
| ABC000002 | SomeData |
| ABC000003 | SomeData |
| ABC000004 | SomeData |
| ABC000005 | SomeData |
| ABC000006 | SomeData |
| ABC000007 | SomeData |
| ABC000008 | SomeData |
| ABC000009 | SomeData |
| ABC000010 | SomeData |
| …         |          |
+-----------+----------+