2015-05-04 33 views
5

muszę wygenerować 3 znakowy ciąg alfanumeryczny, w SQL Server 2008, jak następuje:alfa-numeryczne w SQL Server

001, 
002, 
..., 
999, 
A01, 
A02, 
..., 
A99, 
B01, 
B02, 
..., 
Z99 

Kolejnym punktem w sekwencji będzie generowana z procedury przechowywane i składowane w kolumnie tabeli NCHAR(3).

+0

Czy napisałeś żadnego kodu do tej pory? –

+0

Jakiej wersji serwera sql używasz? –

+0

"Relacyjnym" sposobem rozwiązania tego problemu byłoby skrzyżowanie łączenia [A-Z], [0-9], [0-9]. Następnie połącz wartości i uporządkuj wynik. W przeciwnym razie można by zastosować bardziej imperatywne podejście. Problem zmienia się nieco, jeśli trzeba * wznowić * poprzednią sekwencję (np. Uzyskać tylko następną wartość). – user2864740

Odpowiedz

6

Aby dostać następną sekwencję można dodać Id podoba

WITH seq AS 
(
    SELECT 
     ROW_NUMBER() OVER (ORDER BY x.alpha + y.number + z.number) AS Id, 
     CONVERT(nchar(3), x.alpha + y.number + z.number) AS Result 
    FROM 
     (
      VALUES 
      ('0'), ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9'), 
      ('A'), ('B'), ('C'), ('D'), ('E'), ('F'), ('G'), ('H'), ('I'), ('J'), 
      ('K'), ('L'), ('M'), ('N'), ('O'), ('P'), ('Q'), ('R'), ('S'), ('T'), 
      ('U'), ('V'), ('W'), ('X'), ('Y'), ('Z') 
     ) x(alpha), 
     (
      VALUES 
      ('0'), ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9') 
     ) y(number), 
     (
      VALUES 
      ('0'), ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9') 
     ) z(number) 
    WHERE 
     NOT (NOT x.alpha BETWEEN '1' AND '9' AND y.number = '0' AND z.number = '0') 
) 
-- Uncomment to see all results 
--SELECT * FROM seq 

SELECT Result FROM seq WHERE Id = (SELECT Id + 1 FROM seq WHERE Result = 'Z01') 

Rezultat

Z02 

Pełna count = 3573 = 999 + (26 * 99)

+0

Pierwsza cyfra potrzebuje 0-9 i alfa, nie tylko 0 i alfa. – James

+0

@James Dzięki, tęskniłem za tym – Eric

+0

@Eric, dobra odpowiedź, ale czy nie jest to pełna liczba 3600? (36 * 10 * 10) – JohnS

0

Innym podejściem do swojej proponowaną procedurą przechowywaną byłoby użycie CROSS JOINs zgodnie z sugestią @ user2864740 i parametr o nazwie @pLastUsed. SP następnie zwraca następną w sekwencji. NB To będzie działać dla wszystkich wersji SQL Server.

CREATE PROCEDURE NextID 
    @pLastUsed CHAR(3) 
AS 
/* Usage 
EXEC NextID 'J64' 

*/ 
BEGIN 
    SET NOCOUNT ON; 
    DECLARE @T1 TABLE (Col CHAR(1)) 
    DECLARE @T2 TABLE (Col CHAR(1)) 
    DECLARE @T3 TABLE (Col CHAR(1)) 
    INSERT @T1 (Col) SELECT '0' UNION ALL SELECT '1' UNION ALL SELECT '2' UNION ALL SELECT '3' UNION ALL SELECT '4' 
           UNION ALL SELECT '5' UNION ALL SELECT '6' UNION ALL SELECT '7' UNION ALL SELECT '8' 
           UNION ALL SELECT '9' UNION ALL SELECT 'A' UNION ALL SELECT 'B' UNION ALL SELECT 'C' 
           UNION ALL SELECT 'D' UNION ALL SELECT 'E' UNION ALL SELECT 'F' UNION ALL SELECT 'G' 
           UNION ALL SELECT 'H' UNION ALL SELECT 'I' UNION ALL SELECT 'J' UNION ALL SELECT 'K' 
           UNION ALL SELECT 'L' UNION ALL SELECT 'M' UNION ALL SELECT 'N' UNION ALL SELECT 'O' 
           UNION ALL SELECT 'P' UNION ALL SELECT 'Q' UNION ALL SELECT 'R' UNION ALL SELECT 'S' 
           UNION ALL SELECT 'T' UNION ALL SELECT 'U' UNION ALL SELECT 'V' UNION ALL SELECT 'W' 
           UNION ALL SELECT 'X' UNION ALL SELECT 'Y' UNION ALL SELECT 'Z' 
    INSERT @T2 (Col) SELECT '0' UNION ALL SELECT '1' UNION ALL SELECT '2' UNION ALL SELECT '3' UNION ALL SELECT '4' 
           UNION ALL SELECT '5' UNION ALL SELECT '6' UNION ALL SELECT '7' UNION ALL SELECT '8' 
           UNION ALL SELECT '9' 
    INSERT @T3 (Col) SELECT '0' UNION ALL SELECT '1' UNION ALL SELECT '2' UNION ALL SELECT '3' UNION ALL SELECT '4' 
           UNION ALL SELECT '5' UNION ALL SELECT '6' UNION ALL SELECT '7' UNION ALL SELECT '8' 
           UNION ALL SELECT '9' 
    SELECT TOP 1 
    t1.Col + t2.Col + t3.Col 
    FROM 
    @T1 t1 
    CROSS JOIN @T2 AS t2 
    CROSS JOIN @T3 AS t3 
    WHERE 
    t1.Col + t2.Col + t3.Col > @pLastUsed 
    ORDER BY 
    t1.Col + t2.Col + t3.Col 
END 
GO 
0

Udostępnienie jednego przykładu do wygenerowania alfanumerycznego numeru sekwencji w SQL Server.

For more reference, You can visit this article.

Tworzenie przykładową tabelę:

CREATE TABLE dbo.tbl_TestVarcharSequence 
(
    VarcharID VARCHAR(10) 
    ,Name VARCHAR(255) 
    ,CONSTRAINT pk_tbl_TestVarcharSequence_VarcharID PRIMARY KEY(VarcharID) 
) 
GO 

utworzony obiekt sekwencji próbki:

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

Tworzenie sekwencji ograniczenie stosując format f namaszczenie:

ALTER TABLE dbo.tbl_TestVarcharSequence 
ADD CONSTRAINT seq_tbl_TestVarcharSequence_VarcharID DEFAULT 
FORMAT((NEXT VALUE FOR dbo.seq_TestVarcharSequenceNumber),'ABC00#') 
FOR VarcharID; 
GO 

wstawiania rekordów kilka przykładowych:

INSERT INTO dbo.tbl_TestVarcharSequence (Name) 
VALUES ('Anvesh'),('Alex'),('Roy'),('Bony') 
GO 

Rezultat:

SELECT * FROM dbo.tbl_TestVarcharSequence 

ABC001  Anvesh 
ABC002  Alex 
ABC003  Roy 
ABC004  Bony