Проще говоря, Tally выглядит следующим образом:
WITH N AS(
SELECT N
FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
SELECT TOP (200)
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
FROM N N1, N N2, N N3)
SELECT *
FROM Tally;
Тогда я подозреваю , что вы хотите сделать, чтобы заменить rCTe (и некоторые из Крестов применимы), было бы что-то вроде этого:
WITH N AS
(SELECT N
FROM (VALUES (NULL),
(NULL),
(NULL),
(NULL),
(NULL),
(NULL),
(NULL),
(NULL),
(NULL),
(NULL)) N (N) ),
Tally AS
(SELECT TOP (200)
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1 AS I
FROM N N1,
N N2,
N N3),
cte AS
(SELECT D.Materialno_start,
D.Materialno_end,
D.Name,
D.MType,
D.Noofstock,
CONCAT(LEFT(D.Materialno_start,CHARINDEX('-',D.Materialno_start)),V.NoStart + ISNULL(T.I,0)) AS NewID
FROM dbo.[data] D
CROSS APPLY (VALUES(TRY_CONVERT(int,STUFF(D.Materialno_start,1,CHARINDEX('-',D.Materialno_start),'')),TRY_CONVERT(int,STUFF(D.Materialno_end,1,CHARINDEX('-',D.Materialno_end),'')))) V(NoStart,NoEnd)
LEFT JOIN Tally T ON T.I <= V.NoEnd - V.NoStart)
SELECT Materialno_start,
Materialno_end,
Materialno_start AS MaterialNo,
Name,
mtype,
noofstock,
NewID
FROM cte
ORDER BY cte.Materialno_start;