sql-server - 根据前缀生成递增数字
问题描述
我有一个包含许多列的数据库表,包括一个 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 中做到这一点?
解决方案
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)
推荐阅读
- javascript - 放大 IE 和 Firefox 时原生滚动条被缩放
- sql - 我有多种产品,其中一些具有相同的 OEM 代码但不同的订单数量大小。需要选择一定的尺寸
- java - Windows 终端的 Jline3 问题
- qemu - Type-1 Hypervisors 非易失性内存隔离
- azure - 请求 Azure 指标数据时出现“AuthorizationFailed”
- c++ - 模板类静态成员函数中的局部静态变量链接
- jquery - 如何限制可以制作的克隆数量
- java - 作为参数传递的类/活动实例在将其分配给类范围的变量并使用它时为空
- php - 使用 php 转发电子邮件时出错
- javascript - 使用 react-datepicker 仅在选定的 div 中选择和更新日期