SQL 中按年份生成8位自增编码/标识

 

看到 CSDN 中有网友提出这个需求,肯定有大虾实现了,只是没有搜索到,自己就实现了一个

None.gif 我想在数据库中的某列依次存储20070001 , 20070002等 , 而到了2008年 , 又变成了2008001 , 2008002 , 这可以在数据库中设置成默认值吗?如果可以怎么设?

http://community.csdn.net/Expert/TopicView3.asp?id=5696192

ExpandedBlockStart.gif ContractedBlock.gif /**/ /*
InBlock.gif * 测试表
ExpandedBlockEnd.gif
*/

None.gif
CREATE   TABLE   [ dbo ] . [ CustomIDTest ]  (
None.gif    
[ ID ]   [ int ]   NOT   NULL  ,
None.gif    
[ Code ]   [ char ]  ( 8 NOT   NULL  
None.gif)
None.gif
ExpandedBlockStart.gifContractedBlock.gif
/**/ /*
InBlock.gif * 功能:按 YYYYxxxx 格式生成目标年份的最大编码,数据类型为 CHAR(8)
InBlock.gif * 说明:特定表范围内有效
InBlock.gif *       未处理溢出情况(当表中某年值已达到YYYY9999)
ExpandedBlockEnd.gif
*/

None.gif
CREATE   FUNCTION  dbo.GenCustomCode(
None.gif    
@Year   INT
None.gif)
None.gif
RETURNS   CHAR ( 8 )
None.gif
AS
None.gif    
BEGIN
None.gif
None.gif        
DECLARE  
None.gif            
@Code   CHAR ( 8 ),
None.gif            
@MinCodeInYear   CHAR ( 8 ),
None.gif            
@MaxCodeInYear   CHAR ( 8 )
None.gif
None.gif        
SELECT   @MinCodeInYear   =   CONVERT ( CHAR ( 4 ),  @Year +   ' 0001 ' @MaxCodeInYear   =   CONVERT ( CHAR ( 4 ),  @Year +   ' 9999 '
None.gif        
None.gif        
SELECT   @Code   =   MAX (Code)  FROM  CustomIDTest  WHERE  Code  >=   @MinCodeInYear   AND  Code  <=   @MaxCodeInYear
None.gif        
IF   @Code   IS   NOT   NULL   AND   @Year   =   CONVERT ( INT SUBSTRING ( @Code 1 4 ))
ExpandedBlockStart.gifContractedBlock.gif            
/**/ /*IF @Code = @MaxCodeInYear 溢出处理*/             
None.gif            
SET   @Code   =   CONVERT ( INT @Code +   1
None.gif        
ELSE
None.gif             
SET   @Code   =   @MinCodeInYear
None.gif    
None.gif        
RETURN   @Code
None.gif
None.gif    
END
None.gif
ExpandedBlockStart.gifContractedBlock.gif
/**/ /*
InBlock.gif * 功能:按 YYYYxxxx 格式生成目标年份的最大ID,数据类型为 INT
InBlock.gif * 说明:特定表范围内有效
InBlock.gif *       未处理溢出情况(当表中某年值已达到YYYY9999)
ExpandedBlockEnd.gif
*/

None.gif
CREATE   FUNCTION  dbo.GenCustomID(
None.gif    
@Year   INT
None.gif)
None.gif
RETURNS   INT
None.gif
AS
None.gif    
BEGIN
None.gif
None.gif        
DECLARE  
None.gif            
@ID   INT ,
None.gif            
@MinIDInYear   INT ,
None.gif            
@MaxIDInYear   INT
None.gif
None.gif        
SELECT   @MinIDInYear   =   @Year * 10000   +   1 @MaxIDInYear   =   @Year * 10000   +   9999
None.gif        
None.gif        
SELECT   @ID   =   MAX (ID)  FROM  CustomIDTest  WHERE  ID  >=   @MinIDInYear   AND  ID  <=   @MaxIDInYear
None.gif        
IF   @ID   IS   NOT   NULL   AND   @Year   =   @ID / 10000
ExpandedBlockStart.gifContractedBlock.gif            
/**/ /*IF @ID = @MaxIDInYear 溢出处理*/             
None.gif            
SET   @ID   =   @ID   +   1
None.gif        
ELSE
None.gif             
SET   @ID   =   @MinIDInYear
None.gif    
None.gif        
RETURN   @ID
None.gif
None.gif    
END
None.gif
None.gif


None.gif --  测试
None.gif--
 自定义年份内自增
None.gif
INSERT   INTO  CustomIDTest( [ ID ] [ Code ] )
None.gif
SELECT  dbo.GenCustomID( DatePart (YY,  DATEADD (YY,  - 1 GetDate ()))), dbo.GenCustomCode( DatePart (YY,  DATEADD (YY,  - 1 GetDate ())))
None.gif
UNION
None.gif
SELECT  dbo.GenCustomID( DatePart (YY,  GetDate ())), dbo.GenCustomCode( DatePart (YY,  GetDate ()))
None.gif
UNION
None.gif
SELECT  dbo.GenCustomID( DatePart (YY,  DATEADD (YY,  1 GetDate ()))), dbo.GenCustomCode( DatePart (YY,  DATEADD (YY,  1 GetDate ())))
None.gif
None.gif
SELECT   *   FROM  CustomIDTest

结果
None.gif ID          Code     
None.gif----------- -------- 
None.gif
20060001      20060001
None.gif
20060002      20060002
None.gif
20060003      20060003
None.gif
20060004      20060004
None.gif
20070001      20070001
None.gif
20070002      20070002
None.gif
20070003      20070003
None.gif
20070004      20070004
None.gif
20080001      20080001
None.gif
20080002      20080002
None.gif
20080003      20080003
None.gif
20080004      20080004

说明:
1、对于此示例,一年内最大增量只有,9999,需要考虑溢出如何处理,此版本未处理
2、因此,根据实际需求,我们可以选择以“天”为编码前缀,并且扩大自增部分长度,避免溢出,
3、当然此时得考虑,使用 INT 型长度是否足够
4、此版本自定义函数,使用传入年份参数
5、若欲始终使用当前系统日期,而不显示指定年份,则需要建立一视图来获取当前日期(因SQLServer中标量函数,不能使用 GetDate() 这样的非标量函数)

转载于:https://www.cnblogs.com/Jinglecat/archive/2007/08/08/847054.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值