给数据表设置自动编号-格式(**yyyymm####)

       当我们设置数据表的时候,一般设置一列为主键,如果利用MS的Sql Server 数据库,可以设置主键列自动编号,它默认的是,从1自动增加。可我们有时,需要将主键列变得有一点意义,比如用年月之后是几位的自动编号,这样看起来,有有一点意义。
例如:一个数据表的结构如下:

If   Exists  ( Select   *   From  SysObjects  Where  Id  =   Object_Id ( ' Invoice ' ))
Drop   Table  dbo.Invoice
GO
Create   Table  dbo.Invoice(
    InvCode 
varchar ( 12 Not   null   Primary   key , -- 开票编号
    InvType     varchar ( 10 Not   null ,         -- 开票类型:整机、配件;
    InvType1  varchar ( 10 Not   null ,         -- 开票类型:采购、销售
    InvType2  varchar ( 10 Not   Null ,         -- 开票类型:普通、增值税
    Tax Numeric( 8 , 2 Not   Null ,         -- 开票金额;
    Cess Numeric( 2 , 2 Not   Null ,         -- 税率;
    InvDate  smalldatetime   Not   Null ,         -- 开票日期;
    Code1  varchar ( 20 Null ,             -- 票号1
    Code2  varchar ( 20 Null ,             -- 票号2
    OPTaxCode  varchar ( 20 Not   Null ,         -- 往业单位税号
    OPName  varchar ( 50 Not   Null ,         -- 往来单位名称
    Note  varchar ( 100 Null ,             -- 备注;
    IsValidate  bit   Not   Null ,          -- 确认标识:默认没有确认;
    Pact  Varchar ( 12 Null              -- 对应合同编号;
)
GO
当建立数据表后,需要设置InvCode数据列为函数所取得的编号,代码如下所示:
-- =============================================================================
/****** 对象: 自定函数 dbo.fu_Invoice_Code ******/
/****** 说明:发票编号 ******/
-- =============================================================================
if   exists  ( select   *   from  dbo.sysobjects  where  id  =   object_id ( ' dbo.fu_Invoice_Code ' ))
drop   function  dbo.fu_Invoice_Code
GO
SET  QUOTED_IDENTIFIER  ON  
GO
SET  ANSI_NULLS  OFF  
GO
 
CREATE   FUNCTION  dbo.fu_Invoice_Code ()  
RETURNS   varchar ( 12 AS   
BEGIN  
    
declare   @ResultCode   varchar ( 12 ) ,  @ToDay   SmallDatetime
    
Select   @ToDay   =  ToDay  From  vw_GetDate
    
if   Exists  (  Select   *   From  Invoice )
    
begin
        
Select    @ResultCode   =    Max  ( InvCode )  From  Invoice
        
-- 取出数据表中最大年份,看是否是当年的信息
         If  (  SubString  (  @ResultCode  ,  3  ,  4  )  =   DateName  (  Year , @ToDay  ) )
        
begin
            
-- 取出数据表中的最大编号的月份,看是否是当前的月份
             If  (  SubString  (  @ResultCode  ,  7  ,  2  )  =   DateName  (  Month  ,  @ToDay  ) )
                
-- 当是当前月份时,把最后四位进行处理,重新获取新的编号
                 Set   @ResultCode   =   Left  (  @ResultCode  ,  8  )  +  
                
Right  (  ' 0000 '   +   Convert  (  varchar  ,  Convert  (  int  ,  SubString  (  @ResultCode  ,  9  ,  4  ) )  + 1   ) ,  4  )
            
else     
            
-- 当不是当前的月份时,取出前六位,之后把当前的月份编号添加上去,再加上0000,组成最大的编号    
                 Set   @ResultCode = Left ( @ResultCode , 6 ) + DateName ( Month , @ToDay ) + ' 0000 '
        
end
        
else  
        
-- 当从数据表中取出的最大年份不是当年时 ,进行如下操作
             Set   @ResultCode   =    ' FP '   +   DateName  (  Year  ,  @ToDay  )  +   DateName  (  Month  ,  @ToDay  )  +   ' 0000 '
    
end
    
else
        
Set   @ResultCode   =    ' FP '   +   DateName  (  Year  ,  @ToDay  )  +   DateName  (  Month  ,  @ToDay  )  +   ' 0000 '
    
return   @ResultCode
END -- -----------------------------------------------------------------------------
ALTER   TABLE  dbo.Invoice  ADD  
-- 自动发票编号
     CONSTRAINT  DF_Invoice_InvCode  DEFAULT  (dbo.fu_Invoice_Code())  FOR  InvCode
GO
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值