SQL Server:序列号生成器实现问题

时间:2009-10-27 11:11:14

标签: sql sql-server

我的客户需要一个序列号为#:YYYYMMDD098的格式,其中 YYYYMMDD 代表今天, 098 是一个3位数字,每次访问时都会增加1连续#。

此外,3位#将每天转回零

我在哪里可以找到此解决方案的参考资料?

感谢。

3 个答案:

答案 0 :(得分:1)

对于SQL Server

DECLARE @OldID char(11), @NewID char(11);
DECLARE @IDbit char(3), @CurrDate char(8)

SET @OldID = '20091027098'
--SET @OldID = '20091026098'

SELECT
    @IDbit = SUBSTRING(@OldID, 9, 3),
    @CurrDate = CONVERT(char(8), GETDATE(), 112)

IF @CurrDate <> LEFT(@OldID, 8)
    SET @NewID = @CurrDate + '000'
ELSE
    SET @NewID = @CurrDate + RIGHT('00' + CAST(CAST(@IDbit AS tinyint) + 1 AS varchar(3)), 3)

SELECT @NewID

答案 1 :(得分:1)

您可能需要一个表来存储这些序列号。确保将日期和数字存储在单独的列中,以便您可以轻松地操作它们。要生成新的序列号,请执行(在事务中):

  • 在尝试同时生成两个序列号时,锁定表格以避免竞争条件。如何执行此操作取决于您使用的数据库,但您需要一个允许读取但不允许写入的锁。
  • SELECT max(serial_no) FROM table WHERE serial_date = ?
  • 如果结果为NULL,则将其设为0,否则将其递增1。
  • 将新序列号插入表格。
  • 解锁桌子。

答案 2 :(得分:0)

对于有人可以指出的现成解决方案而言,这似乎太过具体了。我不太清楚“访问”是什么意思,因为你必须有一些更新才能记住你到目前为止所处的位置。此外,我使用超过3位数的计数器 - 你肯定会溢出一段时间。

我建议采取以下措施:

设置一个包含一行的表来保存计数器并将其初始值设置为今天的日期+ 000(例如20091027000)。创建一个存储过程,在事务内部递增计数器并返回新值。要在每天早上重新启动序列,你可以在预定的工作中执行此操作,或者让存储过程将计数器的日期部分与今天的日期进行比较,如果不是今天,则重置计数器。