存储过程生成流水号----灵活版

 
SQL SERVER 2000 存储过程生成编号-流水号
2008-06-24 21:32
表:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[NumSeq]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[NumSeq]
GO

CREATE TABLE [dbo].[NumSeq] (
    [Prefix] [varchar] (6) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [Seq] [int] NOT NULL ,
    [LastDate] [datetime] NOT NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[NumSeq] WITH NOCHECK ADD
    CONSTRAINT [PK_NumSeq] PRIMARY KEY CLUSTERED
    (
        [Prefix]
    ) ON [PRIMARY]
GO

ALTER TABLE [dbo].[NumSeq] ADD
    CONSTRAINT [DF_NumSeq_Prefix] DEFAULT (0) FOR [Prefix],
    CONSTRAINT [DF_NumSeq_Seq] DEFAULT (0) FOR [Seq],
    CONSTRAINT [DF_NumSeq_LastDate] DEFAULT (getdate()) FOR [LastDate]
GO
存储过程:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[GetSeqNum]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[GetSeqNum]
GO

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO



CREATE PROCEDURE GetSeqNum
    @Prefix    VARCHAR(6)  
AS
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
    BEGIN TRANSACTION   
        DECLARE
        @Seq INT,
        @LastDate DATETIME,
        @Now DATETIME,
        @MaintainNo VARCHAR(20)

        ----INIT
        SELECT @Now=GETDATE()

      
        ----INSERT
        IF NOT EXISTS(SELECT * FROM NumSeq WHERE Prefix=@Prefix)
        BEGIN
                        INSERT INTO NumSeq(Prefix,Seq,LastDate) VALUES(UPPER(@Prefix),0,@Now)     
        END
              
    --GET LastDate
        SELECT @LastDate=LastDate FROM NumSeq WHERE Prefix=@Prefix
      
    ----IF LastDate > Now
    IF(@LastDate > @Now)
    BEGIN           
        RAISERROR ('LastDate < Now ,Please check system time.' , 16, 1) WITH NOWAIT
        ROLLBACK TRANSACTION
        RETURN 0
    END ELSE BEGIN
            ----UPDATE
            IF (DATEDIFF(DAY,@LastDate,@Now)<>0)
            BEGIN
                UPDATE NumSeq SET LastDate=@NOW,Seq=1 WHERE Prefix=@Prefix
            END ELSE BEGIN
                UPDATE NumSeq SET Seq=Seq + 1 WHERE Prefix=@Prefix
            END
   
            ----Get Seq Num
            SELECT @Seq=Seq FROM NumSeq WHERE Prefix=@Prefix      
            SELECT @MaintainNo=UPPER(@Prefix) + CONVERT(VARCHAR(12), @Now,112) + RIGHT('000000' + CONVERT(VARCHAR(6),@Seq),6)  
   
            ----Return
            SELECT @MaintainNo
    END
    COMMIT TRANSACTION


GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO



执行 exec getseqnum 'aaa',输出 AAA20080624000003
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值