之前有寫了一篇「簡單的取流水單號Stored Procedure」,它允許取出一個或是多個流水號出來,傳回起始單號(FROM_NO)及結束單號(TO_NO)。
那如果是要傳回所有的流水號要如何做呢?
之前有寫了一篇「簡單的取流水單號Stored Procedure」,它允許取出一個或是多個流水號出來,傳回起始單號(FROM_NO)及結束單號(TO_NO)。
那如果是要傳回所有的流水號要如何做呢?
這時,我們可以套用前篇筆者寫的「透過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
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^