我想创建一个SSMS存储过程来自动生成玩家编号,例如000001,000002,000009,000010等。我希望当我点击前端的刷新时它应该自动生成
ALTER proc [SDS].[usp_autgennum]
AS
BEGIN
declare @playernumber varchar(50)
select '00000'+ cast(max(cast(substring('000001',6,100) as int)) + 1 as varchar) as playernumber
from SDS.tblPlayerList
END
不要尝试自己创建自动递增的数字。
这很容易出错,并且在 T-SQL 中几乎不可能正确执行。
相反,依靠 SQL Server 已经内置的功能来帮助您实现目标 - 使用
identity
列或 sequence
对象。
前导零是格式问题,应在显示中处理,而不是在数据库中处理。
但请注意,使用
identity
或 sequence
时,由于多种原因生成的数字可能存在间隙。如果您需要数字连续且没有间隙,您可以使用基于
identity
或 sequence
的计算列来实现这一点,但请注意,如果在表本身上完成,它可能会带来性能损失.
如果您已经在使用存储过程,最简单也可能是最好的方法是添加一个
row_number()
列并按 id 对其进行排序(假设 id 是一个 identity
列) - 因此存储过程将是这样的:
ALTER proc [SDS].[usp_autgennum]
AS
BEGIN
SELECT ROW_NUMBER() OVER(ORDER BY id) AS playernumber
-- , whatever other columns you need here
FROM SDS.tblPlayerList
END
如果你确实必须用前导零格式化结果,你可以这样做:
SELECT RIGHT('000000' + CAST(ROW_NUMBER() OVER(ORDER BY id) As varchar(6)), 6) AS playernumber
-- , whatever other columns you need here
FROM SDS.tblPlayerList