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

本文介绍如何在SQL Server数据库中为数据表设置有意义的自动编号。通过使用自定义函数fu_Invoice_Code,实现根据年月自动生成带有特定格式的主键编号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       当我们设置数据表的时候,一般设置一列为主键,如果利用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(12Not null Primary key,--开票编号
    InvType    varchar(10Not null,        --开票类型:整机、配件;
    InvType1 varchar(10Not null,        --开票类型:采购、销售
    InvType2 varchar(10Not Null,        --开票类型:普通、增值税
    Tax Numeric(8,2Not Null,        --开票金额;
    Cess Numeric(2,2Not Null,        --税率;
    InvDate smalldatetime Not Null,        --开票日期;
    Code1 varchar(20Null,            --票号1
    Code2 varchar(20Null,            --票号2
    OPTaxCode varchar(20Not Null,        --往业单位税号
    OPName varchar(50Not Null,        --往来单位名称
    Note varchar(100Null,            --备注;
    IsValidate bit Not Null,         --确认标识:默认没有确认;
    Pact Varchar(12Null            --对应合同编号;
)
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(12AS  
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值