Tout savoir sur SEQUENCE avec SQL Server 2012

Obtenir une plage de valeurs entières séquentielles

Dans le cas où l’on a besoin d’obtenir une plage de valeurs séquentielles à partir d’une SEQUENCE, il n’est pas besoin de faire plusieurs fois appel à NEXT VALUE, ni même de spécifier un WHILE : la procédure stockée système sys.sp_sequence_get_range est là pour cela. Cependant il y a plusieurs aspects déplaisants :

  • Elle ne retourne pas toutes les valeurs générées par la plage demandée, mais seulement la première et la dernière valeur de la plage. On aurait peut-être plus vu une fonction de table qui retourne l’ensemble des valeurs générées.
    Avec l’implémentation actuelle, je ne vois pas de cas où il serait intéressant d’utiliser cette procédure stockée dans un module T-SQL. En revanche la visée est peut-être exclusivement aux applications, que l’on peut programmer pour distribuer les valeurs dans le code.
  • Elle retourne les valeurs de début et de fin de plage sous le « type » sql_variant, ce qui est difficilement compréhensible, étant donné que l’on ne peut créer des SEQUENCE qu’avec des types entiers.
  • En plus de la valeur de début et de fin de la plage, elle retourne aussi combien de fois la SEQUENCE a cyclé; en revanche la présence de l’incrément, et des valeurs minimales et maximales que la SEQUENCE peut atteindre est à mon sens discutable.
  • Voici un petit exemple :

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    CREATE SEQUENCE range_sequence
    AS int
    MINVALUE 1
    MAXVALUE 5
    CYCLE
    CACHE 10
    GO

    DECLARE @first_value sql_variant
            , @last_value sql_variant

    EXEC sys.sp_sequence_get_range
            @sequence_name = 'range_sequence'
            , @range_size = 12
            , @range_first_value = @first_value OUTPUT
            , @range_last_value = @last_value OUTPUT

    SELECT  CAST(@first_value AS int) AS first_value
            , CAST(@last_value AS int) AS last_value
            , NEXT VALUE FOR range_sequence AS next_value
    GO

    Laisser un commentaire