Как объединить строку последовательных чисел (в диапазоне) в SQL с циклом? - PullRequest
1 голос
/ 26 марта 2019

Возможно, на этот вопрос дан ответ, но у меня может быть другая проблема, которую нужно решить.

У меня есть следующая строка: '123456' и следующий диапазон: 05 - 10

Как я могу объединить строку с каждым числом в диапазоне, поэтому у меня есть: 12345605 12345606 12345607 12345608 12345609 12345610

У меня будет хранимая процедура, которая принимает 6-значный код, минимальное и максимальное числа в диапазоне.Тогда мне придется сделать какую-то обработку данных.Он может быть вставлен позже или удален, или что-то в этом роде.

Это то, что я буду иметь в своей хранимой процедуре:

declare
    @firstSix varchar(6),
    @min varchar(2),
    @max varchar(2)

To do that I have started to write a loop:

WHILE(CAST(@min AS int) <= CAST(@max AS int)
BEGIN
     --here I will need to write a logic that concatenates the string. 
     SET @min = @min + 1
     SELECT @firstSix
END

Итак, используя следующий вход exec myProcedure '123456', '05', '10' Iбудет иметь следующий вывод:

12345605
12345606
12345607
12345608
12345609
12345610

или с использованием следующего ввода exec myProcedure '123456', '15', '20' У меня будет следующий вывод:

12345615
12345616
12345617
12345618
12345619
12345620

Мне, вероятно, потребуется логика дляопределить, имеет ли значение в диапазоне начальный ноль или что-то в этом роде

Какой здесь лучший подход?

1 Ответ

0 голосов
/ 26 марта 2019

Требуется рекурсивная CTE :

with cte as (
     select @firstSix as firstSix , cast(@min as int) as mn, cast(@max as int) as mx
     union all
     select firstSix, mn + 1 , mx
     from cte
     where mn < mx
)
select concat(firstSix, right(concat('0', mn), 2))
from cte c;

По умолчанию имеет 100 уровень рекурсии, если у вас большой суффикс, а затем подсказка запроса option (maxrecursion 0).

РЕДАКТИРОВАТЬ: Использование LOOP

DECLARE @table table (firstSix varchar(255))

WHILE(CAST(@min AS int) <= CAST(@max AS int))
BEGIN
     --here I will need to write a logic that concatenates the string. 
     INSERT INTO @table (firstSix)
         SELECT concat(@firstSix, right(concat('0', @min), 2))

     SET @min = @min + 1
END

SELECT firstSix
FROM @table;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...