Hi Ahmed,
Here is a conceptual example for SQL Server 2012 onwards.
It is using SELECT with OFFSET / FETCH clauses.
Exactly what you need.
-- DDL and data population, start
DECLARE @tbl TABLE (
ID INT PRIMARY KEY
, [Description] VARCHAR(100) NOT NULL
);
INSERT INTO @tbl
VALUES (1, 'One')
, (2, 'Two')
, (3, 'Three')
, (4, 'Four')
, (5, 'Five')
, (6, 'Six')
, (7, 'Seven')
, (8, 'Eight')
, (9, 'Nine')
, (10, 'Ten')
, (11, 'Elleven')
, (12, 'Twelve')
, (13, 'Thirteen');
-- DDL and data population, end
DECLARE @BatchNo INT = 1
, @NumberOfBatchesTotal DECIMAL = 3
, @RowsPerBatch INT
, @RowTotal INT;
-- To calculate # of rows per each Batch
SET @RowTotal = (SELECT COUNT(*) FROM @tbl);
SET @RowsPerBatch = CEILING(@RowTotal/@NumberOfBatchesTotal);
WHILE @BatchNo <= @NumberOfBatchesTotal
BEGIN
SELECT * FROM @tbl
ORDER BY ID
OFFSET (@BatchNo - 1) * @RowsPerBatch ROWS
FETCH NEXT @RowsPerBatch ROWS ONLY
SET @BatchNo += 1;
END;