题目:设计主键生成存储过程
一个业务表应该有主键,对于主键的处理可以采用表的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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。