Fix “The requested range for sequence object ‘…’ exceeds the maximum or minimum limit. Retry with a smaller range.” (Error 11732) in SQL Server

If you’re getting an error that reads something like “The requested range for sequence object ‘Sequence1’ exceeds the maximum or minimum limit. Retry with a smaller range.” in SQL Server, it’s probably because you’re trying to return a value that’s outside the range of the sequence object.

This can happen when you’re using the sp_sequence_get_range stored procedure to return a range from a sequence object that exceeds the minimum or maximum value for that sequence object, and the sequence object does not have CYCLE defined. It’s a similar error to error 11728, which can happen when using NEXT VALUE FOR to generate a new value from a sequence.

To fix this issue, either use a range that fits within the range of the sequence object, or change the sequence object to CYCLE.

Example of Error

Suppose we create the following sequence object:

CREATE SEQUENCE Sequence1
    START WITH 1
    INCREMENT BY 1
    MINVALUE 1
    MAXVALUE 1000
    NO CYCLE;

This sequence is set to NO CYCLE, which means that it won’t cycle back to the MINVALUE after it reaches MAXVALUE. Instead, it will return the error mentioned above.

So let’s pass our sequence to the sp_sequence_get_range stored procedure:

DECLARE 
    @FirstValue sql_variant,
    @LastValue sql_variant,
    @CycleCount int,
    @Incr sql_variant,
    @MinValue sql_variant,
    @MaxValue sql_variant;
  
EXEC sys.sp_sequence_get_range
    @sequence_name = N'dbo.Sequence1',
    @range_size = 600,
    @range_first_value = @FirstValue OUTPUT,
    @range_last_value = @LastValue OUTPUT,
    @range_cycle_count = @CycleCount OUTPUT,
    @sequence_increment = @Incr OUTPUT,
    @sequence_min_value = @MinValue OUTPUT,
    @sequence_max_value = @MaxValue OUTPUT;
  
SELECT 
    @FirstValue AS FirstValue,
    @LastValue AS LastValue,
    @CycleCount AS CycleCount,
    @Incr AS Increment,
    @MinValue AS MinValue,
    @MaxValue AS MaxValue;

Result:

FirstValue  LastValue  CycleCount  Increment  MinValue  MaxValue
----------  ---------  ----------  ---------  --------  --------
1           600        0           1          1         1000    

So far, so good. This is what we’d normally expect from the sp_sequence_get_range stored procedure. We specified a @range_size of 600, which is reflected in the results with the difference between the FirstValue and LastValue columns.

However, if we run the same code again, we end up with the following error:

Msg 11732, Level 16, State 1, Procedure sys.sp_sequence_get_range_internal, Line 1
The requested range for sequence object 'Sequence1' exceeds the maximum or minimum limit. Retry with a smaller range.

We get this error because we exceeded the sequence’s MAXVALUE of 1000. This is because our @range_size of 600 would have resulted in a LastValue of 1200, which is outside the range of our sequence object (which has a range of 1000).

Solution 1

One way to fix this issue is to change our @range_size to a smaller range:

DECLARE 
    @FirstValue sql_variant,
    @LastValue sql_variant,
    @CycleCount int,
    @Incr sql_variant,
    @MinValue sql_variant,
    @MaxValue sql_variant;
  
EXEC sys.sp_sequence_get_range
    @sequence_name = N'dbo.Sequence1',
    @range_size = 200,
    @range_first_value = @FirstValue OUTPUT,
    @range_last_value = @LastValue OUTPUT,
    @range_cycle_count = @CycleCount OUTPUT,
    @sequence_increment = @Incr OUTPUT,
    @sequence_min_value = @MinValue OUTPUT,
    @sequence_max_value = @MaxValue OUTPUT;
  
SELECT 
    @FirstValue AS FirstValue,
    @LastValue AS LastValue,
    @CycleCount AS CycleCount,
    @Incr AS Increment,
    @MinValue AS MinValue,
    @MaxValue AS MaxValue;

Result:

FirstValue  LastValue  CycleCount  Increment  MinValue  MaxValue
----------  ---------  ----------  ---------  --------  --------
601         800        0           1          1         1000    

Solution 2

Another way to fix it is to change the range of the sequence object:

ALTER SEQUENCE Sequence1 MAXVALUE 2000;

Now we can run the code with the original @range_size again without error:

DECLARE 
    @FirstValue sql_variant,
    @LastValue sql_variant,
    @CycleCount int,
    @Incr sql_variant,
    @MinValue sql_variant,
    @MaxValue sql_variant;
  
EXEC sys.sp_sequence_get_range
    @sequence_name = N'dbo.Sequence1',
    @range_size = 600,
    @range_first_value = @FirstValue OUTPUT,
    @range_last_value = @LastValue OUTPUT,
    @range_cycle_count = @CycleCount OUTPUT,
    @sequence_increment = @Incr OUTPUT,
    @sequence_min_value = @MinValue OUTPUT,
    @sequence_max_value = @MaxValue OUTPUT;
  
SELECT 
    @FirstValue AS FirstValue,
    @LastValue AS LastValue,
    @CycleCount AS CycleCount,
    @Incr AS Increment,
    @MinValue AS MinValue,
    @MaxValue AS MaxValue;

Result:

FirstValue  LastValue  CycleCount  Increment  MinValue  MaxValue
----------  ---------  ----------  ---------  --------  --------
801         1400       0           1          1         2000    

Solution 3

Another way to do eliminate the error is to change the sequence object to a cycling sequence. While this likely won’t be appropriate in many cases, it’s still an option:

ALTER SEQUENCE Sequence1 CYCLE;

Now we can exceed the MAXVALUE without error, because it will cycle back through the range each time the end of the range has been reached

Let’s increase the @range_size and run the stored procedure again:

DECLARE 
    @FirstValue sql_variant,
    @LastValue sql_variant,
    @CycleCount int,
    @Incr sql_variant,
    @MinValue sql_variant,
    @MaxValue sql_variant;
  
EXEC sys.sp_sequence_get_range
    @sequence_name = N'dbo.Sequence1',
    @range_size = 800,
    @range_first_value = @FirstValue OUTPUT,
    @range_last_value = @LastValue OUTPUT,
    @range_cycle_count = @CycleCount OUTPUT,
    @sequence_increment = @Incr OUTPUT,
    @sequence_min_value = @MinValue OUTPUT,
    @sequence_max_value = @MaxValue OUTPUT;
  
SELECT 
    @FirstValue AS FirstValue,
    @LastValue AS LastValue,
    @CycleCount AS CycleCount,
    @Incr AS Increment,
    @MinValue AS MinValue,
    @MaxValue AS MaxValue;

Result:

FirstValue  LastValue  CycleCount  Increment  MinValue  MaxValue
----------  ---------  ----------  ---------  --------  --------
1401        200        1           1          1         2000    

This time it cycled back to the start of the sequence’s range and continued until the 800 range size was met.