2017-02-08 3 views
1

Я хочу сделать алгоритм для генерации следующей серии номер по указанному номеру последней серии в SQL, как показано ниже:Алгоритм генерируется автоматически номер серии в SQL

 Last Number Next Number 
>  AAAA095  AAAA096 
>  AAAA999  AAAB001 
>  AAAB001  AAAB002 
>  AAAZ999  AABA001 
+1

Интересно. Удачи! Дайте нам знать, как вы справляетесь ... – HoneyBadger

+1

Добавьте теги, которые вы используете. – jarlh

+0

смотрит на меня, что ваш номер на самом деле является двумя значениями - один является базовым номером 26 (с использованием только буквенных символов) с длиной 4, второй - десятичным числом длины три. Вам нужно подумать о том, как вы увеличиваете каждый из этих элементов - покажите нам, что вам удалось сделать до сих пор, и мы сможем помочь –

ответ

1

После некоторых попробовать, наконец я получил алгоритм & создания это для SQL Скалярнозначная функция по этому вопросу, как показано ниже

CREATE FUNCTION GetNextSeries (@lastSeriesNo VARCHAR(8)) 
RETURNS VARCHAR(8) 
AS 
BEGIN 

    DECLARE @nextSeriesNo VARCHAR(8) 
    DECLARE @CHAR1 CHAR=SUBSTRING(@lastSeriesNo,1,1) 
    DECLARE @CHAR2 CHAR=SUBSTRING(@lastSeriesNo,2,1) 
    DECLARE @CHAR3 CHAR=SUBSTRING(@lastSeriesNo,3,1) 
    DECLARE @CHAR4 CHAR=SUBSTRING(@lastSeriesNo,4,1) 
    DECLARE @n INT=SUBSTRING(@lastSeriesNo,5,3) 

    SET @n = @n + 1 
    IF(@n>999) 
    BEGIN 
     SET @n=1 
     IF(@CHAR4<>'Z') 
     BEGIN 
      SET @CHAR4=CHAR(UNICODE(@CHAR4)+1) 
     END 
     ELSE IF(@CHAR3<>'Z') 
     BEGIN 
      SET @CHAR4='A' 
      SET @CHAR3=CHAR(UNICODE(@CHAR3)+1) 
     END 
     ELSE IF(@CHAR2<>'Z') 
     BEGIN 
      SET @CHAR4='A' 
      SET @CHAR3='A' 
      SET @CHAR2=CHAR(UNICODE(@CHAR2)+1) 
     END 
     ELSE IF(@CHAR1<>'Z') 
     BEGIN 
      SET @CHAR4='A' 
      SET @CHAR3='A' 
      SET @CHAR2='A' 
      SET @CHAR1=CHAR(UNICODE(@CHAR1)+1) 
     END 
    END 

    SET @[email protected][email protected][email protected][email protected]+(CASE LEN(@n) WHEN 1 THEN '00' WHEN 2 THEN '0' ELSE '' END)+convert(VARCHAR(3),@n) 
    RETURN @nextSeriesNo 
END