?题目:设计主键生成存储过程
一个业务表应该有主键,对于主键的处理可以采用表的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
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|