[SQL]簡單的取流水單號Stored Procedure(II)

之前有寫了一篇「簡單的取流水單號Stored Procedure」,它允許取出一個或是多個流水號出來,傳回起始單號(FROM_NO)及結束單號(TO_NO)。
那如果是要傳回所有的流水號要如何做呢?

之前有寫了一篇「簡單的取流水單號Stored Procedure」,它允許取出一個或是多個流水號出來,傳回起始單號(FROM_NO)及結束單號(TO_NO)。

image

 

那如果是要傳回所有的流水號要如何做呢?

這時,我們可以套用前篇筆者寫的「透過common table expressions (CTE)來產生某區間的連續序號」,來將每個序號傳出來。

所以修改之前的Stored Procedure,如下,


--要先建立序號流水號檔,以記錄取到的流水號
CREATE TABLE dbo.[SYSTEM_SEQ_NO]
(
  [TYPE] [varchar](12) NULL ,
  [PREFIX] [varchar](20) NULL ,
  [CURRENT_NO] [int] NULL
);
go

DELETE FROM [SYSTEM_SEQ_NO];

IF EXISTS ( SELECT  *
            FROM    dbo.sysobjects
            WHERE   id = OBJECT_ID(N'[dbo].[USP_GET_SYS_SEQ_NO_2]')
                    AND OBJECTPROPERTY(id, N'IsProcedure') = 1 )
    DROP PROCEDURE [dbo].[USP_GET_SYS_SEQ_NO_2]
GO

CREATE PROCEDURE dbo.USP_GET_SYS_SEQ_NO_2
/****************************************************************************************
'程式代號:dbo.USP_GET_SYS_SEQ_NO 
'程式名稱:取得流水單號
'目  的:
'參數說明:
(
@TYPE varchar(12)='', --類別
@PREFIX varchar(20)='', -- 前置詞
@NO_LENGTH int = 5 , --流水號長度
@COUNT int=1           --取得筆數
)    
'範 例 :
    EXEC USP_GET_SYS_SEQ_NO_2 '財務', 'PREFIX', 5, 10
    EXEC USP_GET_SYS_SEQ_NO_2 '財務', 'PREFIX', 5, 1
	EXEC USP_GET_SYS_SEQ_NO_2 '財務', 'PREFIX', 5, 3
****************************************************************************************/
(
  @TYPE VARCHAR(12) = '' ,   --申請類別
  @PREFIX VARCHAR(20) = '' , -- 前置詞
  @NO_LENGTH INT = 5 , --流水號長度
  @COUNT INT = 1  --取得筆數
)
AS
BEGIN
	DECLARE @TO_NO INT

--檢查流水號是否存在
	IF NOT EXISTS ( SELECT  *
					FROM    SYSTEM_SEQ_NO(NOLOCK)
					WHERE   TYPE = @TYPE
							AND PREFIX = @PREFIX )
		BEGIN
			INSERT  INTO SYSTEM_SEQ_NO
			VALUES  ( @TYPE, @PREFIX, 0 )
		END

	BEGIN TRAN
  --取出流水號並更新資料
	UPDATE  SYSTEM_SEQ_NO
	SET     CURRENT_NO = CURRENT_NO + @COUNT ,
			@TO_NO = CURRENT_NO + @COUNT
	WHERE   TYPE = @TYPE
			AND PREFIX = @PREFIX
	COMMIT TRAN
--取出各個流水號
;
	WITH    SEQ_RESULT
			  AS ( SELECT   @TO_NO AS NUM ,
							@COUNT AS CNT
				   UNION ALL
				   SELECT   NUM - 1 ,
							CNT - 1
				   FROM     SEQ_RESULT
				   WHERE    CNT > 1
				 )
		SELECT  FROM_NO = @PREFIX + RIGHT('0000000000'
										  + CONVERT(VARCHAR, Z.NUM),
										  @NO_LENGTH)
		FROM    SEQ_RESULT Z
		ORDER BY Z.NUM
END

image

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^