数据库自增字段是字符型的简单处理

在做数据库练习的时候,遇到一个问题,是以前从未接触但是看过人家实现的问题:
描述1:学号总共 12 位,由字母 XH+年+6 位数字编号组成(如 XH2014000001), 必
须唯一, 在新增时自动生成,数字编号自动增长
问题:数据库中自增的都是int型,变成字符串该怎么办呢?因为在数据库端实现自增,不能在软件端处理了。在不考虑
几个函数的解释:
Right(str,len)-字段返回最右边的len个字符的字符串str
MAX()-字段中最大的值
IsNull() 如为空就为空
思路:

首先这是个自定义函数
前面的XH固定
年为YEAR(GETDATE())
查找表中该列中的最大值取到后(右)6位,最大的+1

 

create function f_GetStudentGuid()
returns varchar(12)
as
begin
declare @studentGuid varchar(12)
select @studentGuid='XH'+CONVERT(varchar,YEAR(GETDATE()))+RIGHT(1000000+ISNULL(RIGHT(MAX(studentGuid),6),0)+1,6)
from StudentInfo
return @studentGuid
end
---------------------


--为表添加 默认值

ALTER TABLE studentinfo ADD DEFAULT ([dbo].[f_GetStudentGuid]()) FOR StudentGuid
GO 


--也可以在图形化界面输入[dbo].[f_GetStudentGuid]()
下面通过输入数据获取以下信息

 

图1


好了,现在我仿照上面的做法来完成以下几个案例。
案例1:成绩记录 Guid 总共 15 位,由字母 CJ+年月日 +数字编号 组成(如CJ2013090700001),必须唯一,在新增时自动生成,数字编号自动增长。
那么,下面我就来写这个函数
-----------------------------

------------------------------

create function f_GetScoreGuid()
returns varchar(15)
as
begin
declare @ScoreGuid varchar(15)
declare @time varchar(8)
set @time=CONVERT(varchar,YEAR(GETDATE()))+RIGHT('00'+CONVERT(varchar,month(getdate())),2)+CONVERT(varchar,DAY(GETDATE()))
select @ScoreGuid='CJ'+@time+RIGHT(100000+ISNULL(RIGHT(MAX(ScoreGuid),5),0)+1,5)
from ScoreInfo
return @ScoreGuid
end

说明:获取时间,注意剩余的位数

注意:月份的获取

RIGHT('00'+CONVERT(varchar,month(getdate())),2)


测试

 


图2

 

 

为了巩固练习,我们继续来完成几个案例
案例2:员工编号总共 6 位,由字母 YG+4 位数字编号组成(如 YG0001),必须唯一,在新增时自动生成,数字编号自动增长。
这个案例只要把时间去掉,减少编号的位数即可

你也来做一个练习吧!

案例3:工资记录 ID 总共 12 位,由字母 GZ+年月+4 位数字编号组成(如 GZ2015040001),
必须唯一,在新增时自动生成,数字编号自动增长。
总结:
1 函数的写法。
2 表 字段对应好
3 如何设置默认值
4 以后可能会接触更加复杂的流水号,这里的方法可能就不适合了。就当一个简单的思维练习吧。

 

create function f_GetCourseID()
returns varchar(6)
as
begin
declare @ID varchar(6)
select @ID='KC'+RIGHT(10000+ISNULL(RIGHT(MAX(ID),4),0)+1,4)
from CourseInfo
return @ID
end

ALTER TABLE CourseInfo ADD DEFAULT ([dbo].[f_GetCourseID]()) FOR StudentGuid
GO 


-------------------------------------------------------
create function f_GetSalaryID()
returns varchar(12)
as
begin
declare @SalaryID varchar(12)
declare @time varchar(6)
set @time=CONVERT(varchar,YEAR(GETDATE()))+RIGHT('00'+CONVERT(varchar,month(getdate())),2)
select @SalaryID='XK'+@time+RIGHT(10000+ISNULL(RIGHT(MAX(SalaryID),4),0)+1,4)
from SubscribedInfo
return @SalaryID
end
ALTER TABLE SubscribedInfo ADD DEFAULT ([dbo].[f_GetSalaryID]()) FOR SalaryID
GO 

 以上的方法即可满足一般需要。当面对复杂的流水号问题时候,可能会用到新的方法,等到我遇到的时候再研究研究。

记录下。

原文地址:https://www.cnblogs.com/fanling521/p/5383879.html