微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sqlserver的主键生成器

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

一个业务表应该有主键,对于主键的处理可以采用表的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] 举报,一经查实,本站将立刻删除。

相关推荐