2016-05-13 13 views
-1

Ich muss Mitarbeiterreferenznummer eindeutige Reihenfolge mit Primärschlüssel generieren. Probe REFNO: (A0001-Z9999) nun die maximale Anzahl (Z9999) nächste Sequenz Ich möchte exeeded generieren:Generieren Sie alphanumerische Sequenz mit gespeicherten SQL-Prozedur

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

...ZZ999 LIKE THIS 
+4

ist es Ihre Hausarbeit, die wir tun müssen oder was? Was hast du bisher versucht? Posten Sie das – mohan111

Antwort

1

Sie können es so machen.

erstes eine Sequenz erstellen, um ganzzahlige Sequenznummern zu erzeugen aus Ausgangs 1.

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

dann eine gespeicherte Prozedur erstellen, die einen Sequenzcode in dem gewünschten Format erzeugt.

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; 

Dann testen Sie die gespeicherte Prozedur.

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

enter image description here

es vier weitere Male an und wir bekommen zu "A0005".

enter image description here

den ersten Breakpoint Um zu testen, die Sequenz Objekt verändern, so dass es wieder 9999. Dann wieder den Testcode auszuführen.

ALTER SEQUENCE dbo.MySeq 
    RESTART WITH 9999; 

enter image description here

enter image description here

enter image description here

Und so weiter ...

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

Um zu testen, was passiert, wenn das Ende des zulässigen Bereichs erreicht wird.

ALTER SEQUENCE dbo.MySeq 
    RESTART WITH 685323; 

enter image description here

Ausführen der gespeicherten Prozedur noch einmal, und sie löst einen Fehler, sagen die Sequenz außerhalb des Bereichs liegt. Das ist Absicht.

enter image description here

1

Diese Abfrage wird Ihnen alle Werte, die Sie brauchen:

--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) 

Ausgang:

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

~ 675.324 Zeilen

Sie das Ergebnis in eine Tabelle setzen können und in gespeicherten Prozedur Rückgabewert, den Sie von dieser Tabelle benötigen.

Verwandte Themen