加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sqlserver的主键生成器

发布时间:2020-12-12 15:41:24 所属栏目:MsSql教程 来源:网络整理
导读:?题目:设计主键生成存储过程 一个业务表应该有主键,对于主键的处理可以采用表的identity 列,来生成自动增长的主键。但是对于复杂的业务表,如果使用 这样的方式,那么主键的作用就太小了,我们应该让主键承担更 重要的含义。 比如:一个行的主键位15,我

?题目:设计主键生成存储过程

一个业务表应该有主键,对于主键的处理可以采用表的identity
列,来生成自动增长的主键。但是对于复杂的业务表,如果使用
这样的方式,那么主键的作用就太小了,我们应该让主键承担更
重要的含义。
比如:一个行的主键位15,我们不能知道这个主键值代表什么含义。
????? 但是如果一个主键为PO0508110004,我们就可以知道PO代表
????? 采购订单,0508代表2005年8月11日,0004代表当天第四号单据。

我们把前两个字母PO称为字轨,所以一个业务主键应该有以下结构:

字轨+日期+序号

请设计一个支持表以及一个存储过程来完成主键的生成;

?

参考答案:
请使用查询分析器运行

--drop table MyRecordNo

use pubs
go

/*
create table MyRecordNo(
? mrn_tablename varchar(20) not null primary key,
? mrn_sign varchar(2) null,
? mrn_lastno int not null,
? mrn_lastdate datetime not null
)

?

*/
go
--------------------------------------------------

drop PROCEDURE getBillNo?

go

CREATE PROCEDURE getBillNo? @tablename varchar(20),@billno varchar(20) output?,@sign varchar(2) = ''
AS

--declare
--? @tablename varchar(20),
--? @billno varchar(20)


declare @lastdate datetime,
??????? @nowdate datetime,
??????? @tmpInt?? int,
??????? @tmpStr?? varchar(4),
??????? @tmpsign varchar(2)

--set @tablename=/'poa/'

select @nowdate=getdate()

if not exists(select mrn_tablename from MyRecordNo where mrn_tablename=@tablename)
begin
? insert into MyRecordNo(mrn_tablename,mrn_sign,mrn_lastno,mrn_lastdate) values(@tablename,@sign,1,@nowdate)
? set @tmpInt = 1
end
else
begin
? select @lastdate=mrn_lastdate from MyRecordNo where mrn_tablename=@tablename
? if (datediff(day,@nowdate,@lastdate ) = 0 )
? begin
??? update MyRecordNo set mrn_lastno = mrn_lastno + 1 where mrn_tablename=@tablename
??? select @tmpInt=mrn_lastno from MyRecordNo where mrn_tablename=@tablename
? end
? else if (datediff(day,@lastdate ) < 0 )
? begin
??
??? update MyRecordNo set mrn_lastno = 1,mrn_lastdate = @nowdate where mrn_tablename=@tablename
??? set @tmpInt=1
? end
? else if (datediff(day,@lastdate ) > 0 )
? begin
??? raiserror ('the db server date has been changed,check please!',16,1)
? end
end
---------------------------------------------------------------------------
--? select @tmpInt
--? select len(rtrim(ltrim(str(1))))
? select @tmpStr=
case len(rtrim(ltrim(str(@tmpInt))))
??? when 1 then '000'+ltrim(str(@tmpInt))
? when 2 then '00'+ltrim(str(@tmpInt))
? when 3 then '0'+ltrim(str(@tmpInt))
? when 4 then ltrim(str(@tmpInt))
end

? set @billno =+ right(convert(varchar(10),112),6) + @tmpStr
? select @tmpsign= mrn_sign from MyRecordNo where mrn_tablename=@tablename
? set @billno=ltrim(rtrim(@tmpsign)) + @billno

--select @billno

GO
---------------------------------------------------------------------------
--CREATE PROCEDURE getBillNo? @tablename varchar(20),@billno varchar(20) output?


declare
? @mybillno varchar(20)

exec getBillNo 'pod',@mybillno output,'PO'

select @mybillno

--select * from MyRecordNo

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读