Вам нужен рекурсив CTE
как
CREATE TABLE Data(
OrderId INT,
SerialFrom BIGINT,
SerialTo BIGINT
);
INSERT INTO Data VALUES
(1, 6605181145833976, 6605181145833980);
WITH CTE AS
(
SELECT SerialFrom
FROM Data
UNION ALL
SELECT SerialFrom + 1
FROM CTE
WHERE CTE.SerialFrom < 6605181145833979
)
SELECT SerialFrom SerialId
FROM CTE;
Возвращает:
+------------------+
| SerialId |
+------------------+
| 6605181145833976 |
| 6605181145833977 |
| 6605181145833978 |
| 6605181145833979 |
+------------------+
Так как число строк известно, и это только 4 значения, вы также можете использовать Table Value Constructor
(что является лучшим выбором в данном случае) как
SELECT SerialFrom + Number SerialId
FROM Data D CROSS JOIN
(VALUES (0), (1), (2), (3)) T(Number);
Вы также можете сделать то же самое с master..spt_values
системной таблицей, как
SELECT SerialFrom + Number SerialId
FROM Data D CROSS JOIN
master..spt_values T
WHERE T.[Type] = 'P'
AND
[Number] <= 3;
Кроме того, я рекомендую не использовать master..spt_values
системную таблицу, поскольку она не документирована, и недокументированные системные таблицы могут быть изменены Microsoft без предупреждения, поэтому следует избегать их использования. Тем не менее это ваш выбор:).
Наконец, вот db<>fiddle
, чтобы поиграть и посмотреть, как это работает.