背景:在练习做一个学生成绩管理系统
数据库设计时碰到了一个这样的问题,
题目: 学号总共 12 位,由字母 XH+年+6 位数字编号组成(如 XH2014000001) ,必
须唯一, 在新增时自动生成,数字编号自动增长。在修改时, 学号无法修改。
请教如何实现;
------解决思路----------------------
首次创建学生表的时候,创建一张Base表,里面创建int类型的字段stuID,初始为0
当有新生要入库时,先读取Base.StuID,然后将其加1作为当前学号的数字部分,那么整个处理方法可以像这样:
SELECT * FROM Base
select 'XH' + CONVERT(VARCHAR(4),GETDATE(),23) + REPLICATE('0',6 - LEN(stuID + 1))+ CAST((StuID + 1) AS VARCHAR) '学号'
FROM Base
StuID
-----------
9
学号
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
XH2015000010
------解决思路----------------------
--建议用触发器完成任务
IF OBJECT_ID('学生表')IS NOT NULL
DROP TABLE 学生表
GO
CREATE TABLE 学生表(
学号 CHAR(12)
,姓名 NVARCHAR(50)
)
GO
--以上模拟学生表
--以下建立一个用于完成功能的触发器
CREATE TRIGGER Student_Trg
ON 学生表
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON
INSERT INTO 学生表
SELECT 'XH'+CONVERT(VARCHAR(4),GETDATE(),20)+RIGHT('000000'+LTRIM(Num+ROW_NUMBER()OVER(ORDER BY GETDATE())),6)
,姓名
FROM INSERTED T1
,(SELECT ISNULL(MAX(RIGHT(学号,6)),0)Num FROM 学生表
WHERE SUBSTRING(学号,3,4)=YEAR(GETDATE()))T2
END
GO
--以下开始模拟插入数据
INSERT INTO 学生表(姓名)
SELECT '张三'
UNION ALL SELECT '李四'
--确认结果
SELECT * FROM 学生表
------解决思路----------------------
--个人思考,参考:
create table test
(id varchar(12) default('XH'+convert(varchar(4),getdate(),120)+dbo.retNum()),
...) --dbo.retNum()函数产生 '000000'-'999999'序列
--关键在于自定义dbo.retNum()函数是否能实现函数产生 '000000'-'999999'序列 的功能?