2016-08-18 32 views
0

我正在开发一个保存员工记录的应用程序,我希望在用户注册新员工时做一些这样的事情,员工注册编号应该在SQL中自动生成,即第一个员工的注册编号应为ISO-2016-01,第二个员工的注册编号应为ISO-2016-02等。如何在员工表中添加员工之前没有生成自动注册sql

+1

为什么不只是使用为您增加的标识列?如果需要的话,你可以重新格式化它以在向用户显示时添加'ISO-XXX'前缀? – Tanner

+1

从@Tanner继续,我假设每年的注册编号发生变化,即在2017年将会是ISO-2017-NN?另外,如果您的员工人数超过99人,这个注册号是否继续如此:ISO-2016-100? –

回答

0

标识等ISO-2016-01不能自动SQL Server生成 - 具有用户注册日期时间,Id列的名称。您必须编写一个函数,在您向表中添加任何新行之前,每次都会为您生成此ID。该功能将 -
1.检查当前年份
2.为当年生成的最后一个ID(您可能希望保留特定年份的ID的跟踪)
3.使用上述数据生成下一个ID 。
希望它有帮助!

0

可能是这样的吗?

ALTER TABLE dbo.Employes 
    ADD RegistrationNumber AS CONCAT('ISO-', DATEPART(year, DateReg), '-', Id); 

其中DateReg - 标识列

1

它可以在不产生额外的领域,如果RegistrationNumber总是在相同的格式(ISO-2016-XXX)

来完成,你可以得到你这样的最后一个数字:

select top 1 substring(r.RegistrationNumber, 10, len(r.RegistrationNumber)) 
from Registrations r 
where substring (r.RegistrationNumber, 5, 4) = '2016' 
order by substring(r.RegistrationNumber, 10, len(r.RegistrationNumber)) desc 

假设这将永远是ISO-2016-(= 9个字符)

一个完整的SQL,您可以使用该功能将是这样的:

declare @year varchar(4) = convert(varchar, datepart(year, getdate())) 
declare @prefix varchar(9) = 'ISO-' + @year + '-' 
declare @number int 
declare @result varchar(20) 

select top 1 
     @number = substring(r.RegistrationNumber, 10, len(r.RegistrationNumber)) 
from Registrations r 
where substring (r.RegistrationNumber, 5, 4) = @year 
order by substring(r.RegistrationNumber, 10, len(r.RegistrationNumber)) desc 

set @number = @number + 1 
set @result = @prefix + convert(varchar, @number) 

select @result 
相关问题