2015-05-04 18 views
5

ho bisogno di generare un 3 sequenza di caratteri alfanumerici, in SQL Server 2008, come segue:alfanumerica in SQL Server

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

L'elemento successivo nella sequenza viene generata da una stored procedure e conservati in una colonna della tabella NCHAR(3).

+0

Hai scritto alcun codice fino ad ora? –

+0

Quale versione di sql-server stai usando? –

+0

Il modo "relazionale" per risolvere questo problema è cross join [A-Z], [0-9], [0-9]. Quindi concatena i valori e ordina il risultato. Altrimenti potrebbe essere usato un approccio più imperativo. Il problema cambia un po 'se si ha bisogno di * riprendere * una sequenza precedente (ad esempio ottenere solo il valore successivo). – user2864740

risposta

6

Per ottenere la sequenza successiva è possibile aggiungere un Id come

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

Risultato

Z02 

conteggio completo = 3573 = 999 + (26 * 99)

+0

La prima cifra ha bisogno di 0-9 e alfa, non solo 0 e alfa. – James

+0

@James Grazie, mi è mancato – Eric

+0

@Eric, bella risposta ma non è il conteggio completo 3600? (36 * 10 * 10) – JohnS

0

Un altro approccio per la vostra la stored procedure proposta consisterebbe nell'utilizzare CROSS JOINs come suggerito da @ user2864740 e avere un parametro chiamato @pLastUsed. L'SP quindi restituisce il successivo nella sequenza. NB Funzionerà per tutte le versioni di 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

Condivisione di un esempio per generare il numero sequenza alfanumerico in SQL Server.

For more reference, You can visit this article.

Crea tabella di esempio:

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

Creare un oggetto campione Sequenza:

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

creare il vincolo sequenza usando FORMATO f unzione:

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

inserire i record pochi campioni:

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

Il Risultato:

SELECT * FROM dbo.tbl_TestVarcharSequence 

ABC001  Anvesh 
ABC002  Alex 
ABC003  Roy 
ABC004  Bony