簡單的取流水號Stored Procedure
前言
我們常常會在某Table中放入Internal的流水號,有時只是要不重覆的流水號而已,那這個SP就可以達到我們的要求哦!
實作
- 建立流水號檔(SYSTEM_SEQ_NO)
CREATE TABLE dbo.[SYSTEM_SEQ_NO] ( [TYPE] [varchar] (12) NULL , [PREFIX] [varchar] (20) NULL , [CURRENT_NO] [int] NULL )
- 建立取流水號的SP(USP_GET_SYS_SEQ_NO)
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[USP_GET_SYS_SEQ_NO]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[USP_GET_SYS_SEQ_NO] GO CREATE PROCEDURE dbo.USP_GET_SYS_SEQ_NO /**************************************************************************************** '程式代號: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 '財務', 'PREFIX', 5, 1 EXEC USP_GET_SYS_SEQ_NO '財務', '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 SELECT FROM_NO=@PREFIX + RIGHT('0000000000' + CONVERT(VARCHAR, @TO_NO-@COUNT+1), @NO_LENGTH) , TO_NO=@PREFIX + RIGHT('0000000000' + CONVERT(VARCHAR, @TO_NO), @NO_LENGTH) END
- 之後就可以呼叫SP取得流水號了!
- 在其他的SP中使用
--建立流水號變數 DECLARE @NEW_SEQ_NO VARCHAR(20) --建立暫存檔來取得流水號 CREATE TABLE #TMP_SEQ_NO (FROM_NO varchar(100),TO_NO VARCHAR(100)) INSERT INTO #TMP_SEQ_NO(FROM_NO,TO_NO) EXEC USP_GET_SYS_SEQ_NO '財務', 'PREFIX', 5, 3 --從暫存檔中取得流水號 SELECT @NEW_SEQ_NO = FROM_NO FROM #TMP_SEQ_NO SELECT @NEW_SEQ_NO
還可以搭配我之前的那篇「SQL批次指定某欄位的序號」來做到,使用者匯入資料的大量取號哦!
附上Source:USP_GET_SYS_SEQ_NO.rar
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^