Quick one today:
In the past, we’ve covered a MAXDOP query hint with details and nuances (and here too). This time, we’ll get into another interesting query hint MAXRECURSION.
One of my colleagues needed to come up with a numbers table with values like this, where there are multiple batches and each batch has some records.
Batch | RecordsInBatch |
1 | 1 |
1 | 2 |
1 | 3 |
1 | 4 |
… | … |
1 | 2500 |
2 | 1 |
2 | 2 |
.. | .. |
2 | 2500 |
.. | .. |
999 | 2500 |
This could be achieved with recursive CTE with a table OPTION (MAXRECURSION = n).
-- -- Numbers table with recursive CTE -- DECLARE @BN INT = 999, @RN INT = 2500 ;WITH BatchNumbers (BatchNum) AS ( SELECT 1 AS BatchNum UNION ALL SELECT BatchNum + 1 AS BatchNum FROM BatchNumbers WHERE BatchNum < @BN ), RecordNumbers (RecNum) AS ( SELECT 1 AS RecNum UNION ALL SELECT RecNum + 1 AS RecNum FROM RecordNumbers WHERE RecNum < @RN ) SELECT BatchNumbers.BatchNum, RecordNumbers.RecNum FROM RecordNumbers CROSS JOIN BatchNumbers ORDER BY BatchNumbers.BatchNum, RecordNumbers.RecNum OPTION (MAXRECURSION 2500) GO
MAXRECURSION – points to keep in mind
- Server-wide, the limit is set to 100.
- Use MAXRECURSION query hint to prevent infinite loops
- Server-wide default is set to 100
- When MAXRECURSION 0 is specified, it is same as infinite loops (no limit)
- In query hint, values for MAXRECURSION range from 0 to 32,767
- In cases where incorrect code enters into production, that results in infinite loops, MAXRECURSION could be used to limit the loops.
_Sqltimes