Проблема на самом деле, как предполагает ошибка, типы данных верхней части рекурсивного CTE и нижней части отличаются:
SELECT [name],system_type_name
FROM sys.dm_exec_describe_first_result_set('select 0900000000000000000000000007165 as start, 0900000000000000000000000008165 as loop_end',NULL,NULL);
Это дает вам numeric(30,0)
для обоих значений. С другой стороны, если вы проверите нижнюю часть, вы получите другие результаты:
SELECT [name],system_type_name
FROM sys.dm_exec_describe_first_result_set('SELECT sq.start +1 AS Start, sq.loop_end FROM(select 0900000000000000000000000007165 as start, 0900000000000000000000000008165 as loop_end) sq',NULL,NULL);
Здесь Start
имеет тип данных numeric(31,0)
, который отличается от верхнего уровня .
Но, если углубиться в мой комментарий, вам лучше воспользоваться подсчетом здесь. Это на самом деле полностью исключит ошибку, так как нет рекурсивного CTE и намного быстрее:
DECLARE @Start numeric(30,0),
@End numeric(30,0);
SET @Start = 0900000000000000000000000007165;
SET @End = 0900000000000000000000000008165;
WITH N AS(
SELECT N
FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
SELECT TOP (CONVERT(bigint,@End - @Start))
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1 AS I
FROM N N1, N N2, N N3, N N4) --This will produce up 10,000 rows. CROSS JOIN to N more for more rows.
INSERT INTO Base.dbo.[Table] (ID)
SELECT RIGHT(CONCAT(REPLICATE('0',31),T.I + @Start),31)
FROM Tally T;