获取单据编号的存储过程

CREATE TABLE [ dbo ] . [ BillNo ] (
[ Id ] [ int ] IDENTITY ( 1 , 1 ) NOT NULL ,
[ BillName ] [ varchar ] ( 20 )COLLATEChinese_PRC_CI_AS NOT NULL ,
[ MaxNo ] [ int ] NULL ,
[ MaxDate ] [ varchar ] ( 20 )COLLATEChinese_PRC_CI_AS NULL ,
[ Prefix ] [ varchar ] ( 20 )COLLATEChinese_PRC_CI_AS NULL ,
[ NumBit ] [ int ] NULL CONSTRAINT [ DF_BillNo_NumBit ] DEFAULT (( 0 )),
[ Style ] [ varchar ] ( 50 )COLLATEChinese_PRC_CI_AS NULL ,
[ Memo ] [ text ] COLLATEChinese_PRC_CI_AS NULL ,
[ CreateDate ] [ datetime ] NULL CONSTRAINT [ DF_BillNo_CreateDate ] DEFAULT ( getdate ()),
[ EditDate ] [ datetime ] NULL ,
[ State ] [ int ] NULL CONSTRAINT [ DF_BillNo_State ] DEFAULT (( 0 )),
CONSTRAINT [ PK_BillNo ] PRIMARY KEY CLUSTERED
(
[ Id ] ASC
)
WITH (IGNORE_DUP_KEY = OFF ) ON [ PRIMARY ]
)
ON [ PRIMARY ] TEXTIMAGE_ON [ PRIMARY ]

GO

CREATE PROCEDURE [ dbo ] . [ p_GetBillNo ] -- 产生按年月日排列的档案号
@BillName varchar ( 20 ),
@No varchar ( 20 )output, -- 为产生的档案号
@NumBit int = 4 -- 编号位数

AS
DECLARE @MaxNo int ,
@MaxDate varchar ( 20 ),
@Prefix varchar ( 20 ),
@xNumBit int ,
@CurrDate varchar ( 12 ),
@FILL_ZERO int ,
@iMaxNo int

SET @FILL_ZERO = 100000000
SET @CurrDate = CONVERT ( VARCHAR ( 8 ), GETDATE (), 112 )

SELECT @MaxNo = MaxNo, @MaxDate = MaxDate, @Prefix = Prefix, @xNumBit = NumBit FROM BillNo WITH (XLOCK) WHERE BillName = @BillName
IF @@ROWCOUNT <> 1 RETURN - 1

IF @xNumBit <> 0 SET @NumBit = @xNumBit

IF @MaxDate <> @CurrDate OR @MaxDate IS NULL OR @MaxNo IS NULL
SET @iMaxNo = 1
ELSE
SET @iMaxNo = @MaxNo + 1

UPDATE BillNo
SET MaxNo = @iMaxNo ,MaxDate = @CurrDate ,EditDate = GetDate () WHERE BillName = @BillName
IF @@ROWCOUNT <> 1 RETURN - 1

SET @No = COALESCE ( @Prefix , '' ) + @CurrDate + RIGHT ( CAST ( @FILL_ZERO + @iMaxNo AS VARCHAR ), @NumBit )

RETURN 1

你可能感兴趣的:(sql,server)