设置表的默认主键编号

       当我们建立数据库的时候,一般通常,我们需要设置数据表的某一列为主键值,作为这条计记录的唯一标识,当我们利用SQL Server 数据库的时候,我们可以通过通过微软自带的功能,使其主键列自动的编号,这种编号规则是从1一直向上递增。当然,我们有时候还是会需要将向通过使用年月日加上几位的顺序编号,作为主键会更有意义。
       下面的是我们对应的数据表结构:

--=============================================================================
/****** 对象:表 dbo.Invoice ******/
/****** 说明:发票管理表 ******/
--=============================================================================
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
-------------------------------------------------------------------------------
下面的是,通过修改标的结构进行对表主键列默认值的设定:
--=============================================================================
/****** 对象: 自定函数 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
GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO
-------------------------------------------------------------------------------
ALTER TABLE dbo.Invoice ADD 
--自动发票编号
    CONSTRAINT DF_Invoice_InvCode DEFAULT (dbo.fu_Invoice_Code()) FOR InvCode
GO
posted @ 2007-03-27 15:09  程晓鹏  阅读(757)  评论(1)    收藏  举报