每年重置自动增量(身份)

问题描述 投票:3回答:3

我正在使用SQL Server 2008 R2,我想创建一个触发器。

对于每个添加(仅添加),将按如下方式更新一列:

ABC-CurrentYear-AutoIncrementCode

示例:

ABC-2013-00001 

ABC-2013-1

ABC永远不会改变

本年可以加上YEAR(GetDate()),但对于最后一部分,我遇到了困难:如何获得最后输入的号码以使最后输入+ 1?

第二个问题:

在2014年,自动递增计数器应重置为1,与2015年相同,等等...

sql tsql sql-server-2008-r2
3个回答
0
投票

您可以这样计算新值:

SELECT 'ABC-' + 
CAST(YEAR(GETDATE()) AS VARCHAR(4)) + '-' + 
RIGHT('00000' + CAST(ISNULL(MAX(CAST(REPLACE(YourColumnName, 'ABC-' + CAST(YEAR(GETDATE()) AS VARCHAR(4)) + '-', '') AS INTEGER)), 0) + 1 AS VARCHAR(5)), 5)
FROM YourTable
WHERE YourColumnName LIKE 'ABC-' + CAST(YEAR(GETDATE()) AS VARCHAR(4)) +'%'

字符串连接的最后一部分特别复杂:

  • RIGHT用于添加前导零
  • ISNULL用于每年重置计数器

0
投票

使用看起来像这样的示例表:

CREATE TABLE MyTable (id INT IDENTITY(1,1), someCol NVARCHAR(20), codeCol NVARCHAR(20))

具有一个id列,一些随机值列和用于存储代码的第三列。

您的触发器可能看起来像这样:

CREATE TRIGGER tgInsertMyTable ON myTable
AFTER INSERT
AS
BEGIN

    DECLARE @code NVARCHAR(20)
    SELECT @code = 'ABC-' + CAST(YEAR(GETDATE()) AS NVARCHAR(4)) + '-'

    DECLARE @max NVARCHAR(20)
    SELECT @max = codeCol FROM dbo.myTable mts WHERE mts.codeCol LIKE @code + '%'

    ;WITH CTE_UPD AS 
    (
        SELECT REPLICATE('0', 5-LEN(CAST(COALESCE(CAST(RIGHT(@max,5) AS INT),0) + ROW_NUMBER() OVER (ORDER BY ins.ID) AS NVARCHAR(5)))) + CAST(COALESCE(CAST(RIGHT(@max,5) AS INT),0) + ROW_NUMBER() OVER (ORDER BY ins.ID) AS NVARCHAR(5)) AS nextNo, id
        FROM INSERTED ins

    )
    UPDATE mt
    SET mt.CodeCol = @code + nextNo 
    FROM dbo.MyTable mt
    INNER JOIN CTE_UPD ins ON ins.ID = mt.ID

END

我知道它在某些地方看起来很复杂,所以我会尝试解释一下,但是首先-这是一个可以正常运行的演示:

SQLFiddle DEMO

所以,首先我在@code变量中设置了所需的代码前缀-这就是没有增量的部分。

第二-我在表的现有行中搜索具有相同前缀的最大值-并将其存储在变量@max中>

第三部分是CTE-用于查找下一个增量值。

  • 从最大值栏中仅最后5个字符(向右功能)
  • 将它们转换为int(CAST)-将其从零开始删除
  • 如果@max为NULL-现在被声明为0(COALESCE)
  • 从插入的行中添加ROW_NUMBER-这很重要-您不能只使用+1,因为您可能会同时添加1行以上的内容(例如在演示中)。这就是首先需要CTE的全部原因。
  • 播放回nvarchar
  • [REPLICATE用于返回5-LEN数量的起始零(计算新的LEN以在数字变为10、100、1000时添加更少的零)]
  • [最后,只需将CTE加入表并使用@code +计算值进行更新

我不确定,是否可能有一个更简单的解决方案,但是该解决方案有效-我认为可以解决所有情况。


0
投票

但是可以在哪里使用这些功能。例如,如果Student表为RegNo。需要此Auto-Year-Increment属性。在存储过程中还是其他地方,应在哪里编写此代码?

© www.soinside.com 2019 - 2024. All rights reserved.