Comment get des lignes répétées selon l'set de données sélectionné en SQL

J'ai une requête CTE mais je n'ai rien de concept à ce sujet. Et je suis nouveau en programmation. En fait, j'ai une colonne Qty dans ma requête et je veux répéter les lignes jusqu'à qty. signifie que si qty est égal à 50 alors l'set de données me renvoie 50 loggings de time. si qty est égal à 1000 mille alors la requête me renvoie 10000 mille loggings. La requête suivante fonctionne bien pour moi jusqu'à <99 rcords comment puis-je grandir pour 1000 rocords.

Merci d'avance.

SELECT * INTO #TableA FROM ( SELECT MIS_Request_Detail.vno, MIS_Request_Detail.IID , MIS_Request_Detail.Qty-MIS_Request_Detail.BalQty qty, 1 RcvdQty, pk, ItmMstr.IName, ItmMstr.UName, '' SrNo, MIS_Request_Detail.Qty As ReqQty, MIS_Request_Detail.BalQty , MIS_Request_Detail.Qty-MIS_Request_Detail.BalQty RemainQty FROM MIS_Request_Detail INNER JOIN view_MIS_Item_Master ItmMstr ON ItmMstr.IID=MIS_Request_Detail.IID WHERE ReqType=1 AND MIS_Request_Detail.vno=@vno ) T ;WITH Nbrs ( Number ) AS ( SELECT 1 UNION ALL SELECT 1 + Number FROM Nbrs WHERE Number < 99 ) SELECT A.vno,A.IID, A.IName, A.UName, CAST(SrNo AS VARCHAR(50)) SrNo , CAST(N.Number AS varchar(50)) QTY, pk ReqDetpk, RcvdQty, A.ReqQty, A.BalQty, A.RemainQty, 0 Color, 0 chked, 0 Pk, 0 AS isupdate , '' AS isdeleted FROM #TableA A JOIN Nbrs N ON N.Number <= A.qty ORDER BY IID, N.Number, pk 

Comme vous l'avez probablement découvert, la limite de récursivité est de 99 pour les CTE récursifs. Pour contourner cela, vous devez utiliser une série de CROSS JOINs, comme on le trouve dans l' article de SQL Magazine par Itzik Ben-Gan .

 WITH L0 AS(SELECT 1 AS c UNION ALL SELECT 1), L1 AS(SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS B), L2 AS(SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B), L3 AS(SELECT 1 AS c FROM L2 AS A CROSS JOIN L2 AS B), L4 AS(SELECT 1 AS c FROM L3 AS A CROSS JOIN L3 AS B), L5 AS(SELECT 1 AS c FROM L4 AS A CROSS JOIN L4 AS B), Nums AS(SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS n FROM L5) SELECT n FROM Nums 

Cela vous donne des numbers jusqu'à 4 milliards.

Dans #TableA j'ajoute Id sur cas si votre table temporaire ne contient pas d'identifiant et le nombre de lignes plus de 1

 SELECT * INTO #TableA FROM ( SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS Id, MIS_Request_Detail.vno, MIS_Request_Detail.IID , MIS_Request_Detail.Qty-MIS_Request_Detail.BalQty qty, 1 RcvdQty, pk, ItmMstr.IName, ItmMstr.UName, '' SrNo, MIS_Request_Detail.Qty As ReqQty, MIS_Request_Detail.BalQty , MIS_Request_Detail.Qty-MIS_Request_Detail.BalQty RemainQty FROM MIS_Request_Detail INNER JOIN view_MIS_Item_Master ItmMstr ON ItmMstr.IID=MIS_Request_Detail.IID WHERE ReqType=1 AND MIS_Request_Detail.vno=@vno ) T ;WITH Nbrs(Id, vno, IID, IName, UName, SrNo, QTY, ReqDetpk, RcvdQty, ReqQty, BalQty, RemainQty, Color, chked, Pk, isupdate, isdeleted, [Level]) AS ( SELECT A.Id, A.vno,A.IID, A.IName, A.UName, CAST(SrNo AS VARCHAR(50)) SrNo , CAST(N.Number AS varchar(50)) QTY, pk ReqDetpk, RcvdQty, A.ReqQty, A.BalQty, A.RemainQty, 0 Color, 0 chked, 0 Pk, 0 AS isupdate , '' AS isdeleted, 1 AS [Level] FROM #TableA A UNION ALL SELECT A.Id, A.vno,A.IID, A.IName, A.UName, CAST(SrNo AS VARCHAR(50)) SrNo , CAST(N.Number AS varchar(50)) QTY, pk ReqDetpk, RcvdQty, A.ReqQty, A.BalQty, A.RemainQty, 0 Color, 0 chked, 0 Pk, 0 AS isupdate , '' AS isdeleted, n.[Level] + 1 FROM #TableA A JOIN Nbrs n ON A.Id = n.Id WHERE A.Number > n.[Level] ) SELECT * FROM Nbrs ORDER BY IID, N.Number, pk