生成规则编号

   生成的编号:例如:jx2009020001 共12位,由“固定开头+年月+0001”组成。回顾了一下写的内容,固定开头是有限制的,必须是2位,整体编号是12位。
一、建立种子表:

--DROP TABLE SST_KEYNO
IF NOT EXISTS (SELECT * FROM DBO.SYSOBJECTS WHERE ID = OBJECT_ID(N'[DBO].[SST_KEYNO]') AND OBJECTPROPERTY(ID, N'ISUSERTABLE') = 1)

BEGIN

  CREATE TABLE [dbo].[SST_KEYNO] (
 [TABLE] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
 [NOTE] [varchar] (12) COLLATE Chinese_PRC_CI_AS NOT NULL ,
 [DATE] [datetime] NOT NULL ,
 [VALUE] [int] NULL
  ) ON [PRIMARY]


  ALTER TABLE [dbo].[SST_KEYNO] WITH NOCHECK ADD
 CONSTRAINT [PK_SST_KEYNO] PRIMARY KEY  CLUSTERED
 (
  [TABLE],
  [NOTE],
  [DATE]
 )  ON [PRIMARY]

END

 

二、存储过程实现生成规则编号:

 

IF EXISTS (SELECT * FROM SYSOBJECTS WHERE NAME = 'GET_MAX_KEYNO' AND TYPE ='P')
DROP PROCEDURE GET_MAX_KEYNO
GO


CREATE  PROCEDURE GET_MAX_KEYNO
(
@TABLE VARCHAR(30),
@NOTE VARCHAR(12),
@KEY_NO VARCHAR(12) OUTPUT
)
--根据传入的"表名/种子"得到最大序号
AS
BEGIN
   DECLARE @MAX_KEY_NO VARCHAR(12)
   DECLARE @VALUE VARCHAR(20)
   DECLARE @VALUE_INT INT

   DECLARE @DATE_PART VARCHAR(8) --如:090501
   DECLARE @DATE_TODAY DATETIME
   SET @DATE_PART = SUBSTRING(convert(varchar(10),getdate(), 112),3,8)
   SET @DATE_TODAY = convert(varchar(10),getdate(),120)
  

   SET @MAX_KEY_NO = @NOTE + @DATE_PART
   
   DECLARE @NUM INT
   SET @NUM = (SELECT COUNT(*) FROM SST_KEYNO WHERE [TABLE]=@TABLE AND NOTE=@NOTE AND [DATE]= @DATE_TODAY)
    
   --1、在表中插入数据value = 2,返回 value = 1拼成的串   
   IF (@NUM = 0)
   BEGIN

     SET @MAX_KEY_NO = @MAX_KEY_NO + REPLACE(SPACE(11-LEN(@MAX_KEY_NO)),' ','0')+'1'

     INSERT INTO SST_KEYNO ([TABLE],[NOTE],[DATE],[VALUE])
       VALUES(@TABLE , @NOTE , @DATE_TODAY , 2)

   END

   --1、查询表中的value值,修改表中值
   IF(@NUM >= 1)
   BEGIN

     SET @VALUE_INT = (SELECT MAX(VALUE) FROM SST_KEYNO WHERE [TABLE]=@TABLE AND NOTE=@NOTE AND [DATE]= @DATE_TODAY)
     SET @VALUE = @VALUE_INT
    
     SET @MAX_KEY_NO = @MAX_KEY_NO + REPLACE(SPACE(12-LEN(@MAX_KEY_NO)-LEN(@VALUE)),' ','0') + @VALUE

     SET @VALUE_INT = @VALUE_INT + 1

     UPDATE SST_KEYNO
        SET VALUE = @VALUE_INT
      WHERE  [TABLE] = @TABLE AND NOTE = @NOTE AND [DATE]= @DATE_TODAY  
    
   END

   SET @KEY_NO = @MAX_KEY_NO
END

/*
DECLARE @KEYNO VARCHAR(12)


execute
   GET_MAX_KEYNO
@TABLE = '1111',
@NOTE = 'JX',
@KEY_NO = @KEYNO OUTPUT

SELECT @KEYNO
*/

posted @ 2009-06-10 17:18  bella  阅读(1258)  评论(0编辑  收藏  举报