首页 > 解决方案 > 根据前缀生成递增数字

问题描述

我有一个包含许多列的数据库表,包括一个 Guid 主键。这工作正常,我无法改变它。

我需要生成一个具有已知前缀和递增填充数字的“友好”字符串标识符。

例如,我有这些行,我需要创建 FriendlyID 列。

ID                                   | Prefix   | FriendlyID
(PK, uniqueidentifier)               |(nvarchar)| 
-------------------------------------|----------|------------ 
93AE63F0-4556-426A-B61D-A86D66DCD904 | AB       | AB0001        
191D1186-1C4D-4A6C-A83B-D803BFAA2DF1 | AB       | AB0002
F28CA0D0-4ED9-4F89-9467-F7C2B7DFDCEE | BC       | BC0001
9DACD157-FF51-447B-BDD6-6A82E3E45758 | DE       | DE0001
AF3952B8-2E28-4D85-85C8-473DA64D6BDB | BC       | BC0002
9DACD157-FF51-447B-BDD6-6A82E3E45758 | AB       | AB0003

数字需要增加,但仅基于前缀。

我知道如何创建一个自动递增的整数列,但我不确定如何使它在前缀内递增。

如果它更容易,我绝对可以构建 FriendlyID 用于显示(例如连接前缀和数字),但我希望数据库处理生成数字部分以确保我们不会发生冲突。如果重要的话,那将在 C#/Entity Framework Core 5 中。

有没有办法在 SQL Server 中做到这一点?

标签: sql-server

解决方案


ROW_NUMBER()您可以使用和适当的ORDER BY子句对行进行编号:

SELECT 
   *,
   CONCAT(
      Prefix, 
      RIGHT(CONCAT('0000', ROW_NUMBER() OVER (PARTITION BY Prefix ORDER BY ID)), 4)
   ) AS FriendlyID
FROM (VALUES
   ('93AE63F0-4556-426A-B61D-A86D66DCD904', 'AB'),        
   ('191D1186-1C4D-4A6C-A83B-D803BFAA2DF1', 'AB'),
   ('F28CA0D0-4ED9-4F89-9467-F7C2B7DFDCEE', 'BC'),
   ('9DACD157-FF51-447B-BDD6-6A82E3E45758', 'DE'),
   ('AF3952B8-2E28-4D85-85C8-473DA64D6BDB', 'BC'),
   ('9DACD157-FF51-447B-BDD6-6A82E3E45758', 'AB')
) v (ID, Prefix)

推荐阅读