2016-05-13 61 views
-1

我需要使用主鍵自動生成員工參考號唯一序列。樣品Personal Data個人紀錄:(A0001-Z9999)現在exeeded最大計數(Z9999) 下一個序列我要生成:使用sql存儲過程生成字母數字序列

AA001-AA999, 
AB001-AB999, 
AZ999-BA001 
BC001-BZ999, 
CA001-CZ999, 
ZA001-ZZ999..LIKE THIS..IN sql server stored procedure.. 

...ZZ999 LIKE THIS 
+4

它是你的家庭作品,我們需要做什麼或什麼?你到目前爲止所嘗試過的?發佈 – mohan111

回答

1

你可以不喜歡這樣。

首先創建一個序列來生成整數的序列號從1

CREATE SEQUENCE dbo.MySeq AS INT 
    START WITH 1 
    INCREMENT BY 1; 

開始然後創建,其產生所需的格式的序列碼的存儲過程。

CREATE PROCEDURE dbo.up_GetNextSequence 
(
    @seq nchar(5) out 
) 
AS 
DECLARE @i int = NEXT VALUE FOR dbo.MySeq; 

IF @i > 685323 
BEGIN 
    RAISERROR(N'Sequence is out of range.', 16, 0); 
END 

IF @i < 10000 
BEGIN 
    SET @seq = N'A' + FORMAT(@i, 'D4'); 
END 
ELSE 
BEGIN 
    DECLARE @j int; 
    SET @j = @i - 9999; 

    DECLARE @k int; 
    SET @k = ((@j - 1) % 999) + 1; 

    DECLARE @l int; 
    SET @l = (@j - 1)/999; 

    DECLARE @m int; 
    SET @m = (@l % 26) + 65; 

    DECLARE @n int; 
    SET @n = (@l/26) + 65; 

    SET @seq = NCHAR(@n) + NCHAR(@m) + FORMAT(@k, 'D3'); 
END; 

然後測試存儲過程。

DECLARE @seq nchar(5); 
EXEC up_GetNextSequence @seq output; 
SELECT @seq AS '@seq' 

enter image description here

說它四次,我們得到了爲 「A0005」。

enter image description here

爲了測試第一斷點,改變序列對象,以便它返回9999。然後再次執行測試代碼。

ALTER SEQUENCE dbo.MySeq 
    RESTART WITH 9999; 

enter image description here

enter image description here

enter image description here

等等......

ALTER SEQUENCE dbo.MySeq 
    RESTART WITH 10998; 

enter image description here

enter image description here

enter image description here

ALTER SEQUENCE dbo.MySeq 
    RESTART WITH 35973; 

enter image description here

enter image description here

ALTER SEQUENCE dbo.MySeq 
    RESTART WITH 659349; 

enter image description here

enter image description here

測試當它到達允許範圍的末尾時會發生什麼。

ALTER SEQUENCE dbo.MySeq 
    RESTART WITH 685323; 

enter image description here

執行存儲過程一個更多的時間和它產生一個錯誤,稱序列超出範圍。這是設計。

enter image description here

1

該查詢會給你所有的值,你需要:

--here we take all the english alphabet 
;WITH chars AS (
SELECT CHAR(65) as chars, 65 as [level] 
UNION ALL 
SELECT CHAR([level]+1), [level]+1 
FROM chars 
WHERE [level]-65 < 25 
), cte AS (-- Here we take didits from 1 to 999 
SELECT 1 as digits 
UNION ALL 
SELECT digits+1 
FROM cte 
WHERE digits < 999 
), codes AS (-- here we get all chars combinations "AA", "AB" etc 
SELECT c1.chars+c2.chars as code 
FROM chars c1 
cross join chars c2 
) 

--And here come cortesian join to get all refnomes ou need 
SELECT code + CASE WHEN LEN(digits) = 1 THEN CONCAT('00',cast(digits as nvarchar(1))) 
      WHEN LEN(digits) = 2 THEN CONCAT('0',cast(digits as nvarchar(2))) 
      ELSE cast(digits as nvarchar(3)) END as Refno 
FROM cte 
CROSS JOIN codes 
ORDER BY code 
OPTION (maxrecursion 1000) 

輸出:

Refno 
AA001 
AA002 
AA003 
AA004 
AA005 
AA006 
AA007 
AA008 
AA009 
AA010 
AA011 
AA012 
AA013 
AA014 
AA015 
AA016 
AA017 
... 
etc 
ZZ999 

〜675324行

你可以把結果到一些表以及您在該表中需要的存儲過程返回值。