在自动生成的id中添加Year Prefix,这是一个主键

时间:2012-01-23 06:02:26

标签: tsql primary-key sql-server-2008-express

我希望我的ID能够自动生成,并且需要这样的格式:

12-0001, 12-0002

12表示2012年,即系统日期的当前年份。

我对ID的最后记录是12-0999,当2013年到来时,我希望我的ID更改年份前缀并重置4位数字,如下所示:

13-0001, 13-0002.

我正在使用asp.net mvc 3和sql server express 2008。

任何人都可以告诉我一种可以做到这一点的方法。

1 个答案:

答案 0 :(得分:2)

我看到两个选项:

(1)如果您要插入数据的表格中有DATEDATETIME列,其中包含“正确”年份,您只需添加一个持久的计算列即可你的桌子 - 类似于:

ALTER TABLE dbo.YourTable
ADD PKID AS RIGHT(CAST(YEAR(DateColumn) AS CHAR(4)), 2) + '-' + 
                RIGHT('00000' + CAST(ID AS VARCHAR(5)), 5) PERSISTED

假设IDINT IDENTITY列,可以自动生成序列号,并且您想要调用新列PKID(根据需要进行更改)。

由于这是持久计算列,因此计算一次 - 插入行时 - 可以将其编入索引并用作主键。

(2)如果你的表中没有类似日期列的内容,那么唯一的选择就是在该表上有一个AFTER INSERT触发器来执行类似这样的操作(再次:假设你有列ID INT IDENTITY以提供自动递增的数字):

CREATE TRIGGER trgInsert ON dbo.YourTable 
AFTER INSERT 
AS 
BEGIN
    DECLARE @YearPrefix CHAR(2)
    SET @YearPrefix = RIGHT(CAST(YEAR(GETDATE()) AS CHAR(4)), 2) 

    UPDATE dbo.YourTable
    SET OtherID = @YearPrefix + '-' + RIGHT('00000' + CAST(i.EmployeeID AS VARCHAR(5)), 5) 
    FROM INSERTED i
    WHERE dbo.YourTable.EmployeeID = i.EmployeeID
END

当然,首先您需要将新的PKID列添加到您的表中,以便触发器可以在其中存储值: - )

ALTER TABLE dbo.YourTable
ADD PKID VARCHAR(10) NOT NULL DEFAULT ('X')  -- needs to be NOT NULL for Primary Key