Une fonction renvoyant une série sous forme de table

Il arrive parois que l’on ait besoin épisodiquement d’une série de nombre continue. Voici une fonction permettant cela…


-- fonction de génération d'une série
CREATE FUNCTION dbo.F_T_GET_SERIE (@IDEBUT INT, @IFIN INT)
RETURNS @T TABLE (I INT)
/******************************************************************************  
* fonction table de génération d'une série discrète d'entiers                 *
*******************************************************************************  
* Fred. Brouard - http://sqlpro.developpez.com - www.sqlspot.com - 2009-03-20 *  
******************************************************************************/  
AS
BEGIN
   IF @IFIN IS NULL OR @IDEBUT IS NULL OR @IFIN < @IDEBUT
      RETURN;
   DECLARE @I INT;
   SET @I = @IDEBUT;
   WHILE @I <= @IFIN
   BEGIN
      INSERT INTO @T VALUES (@I);
      SET @I += 1;
   END
   RETURN;
END      
GO

Exemple d’utilisation :


SELECT *
FROM   dbo.F_T_GET_SERIE (7, 13)
 
I
-----------
7
8
9
10
11
12
13

NOTA : il est généralement nettement préférable d’utiliser une table d’entiers instancié dans votre base que d’utiliser cette fonction pour des raisons de performances.


Frédéric BROUARD, Spécialiste modélisation, bases de données, optimisation, langage SQL.
Le site sur le langage SQL et les S.G.B.D. relationnels : http://sqlpro.developpez.com/
Expert SQL Server http://www.sqlspot.com : audit, optimisation, tuning, formation
* * * * * Enseignant au CNAM PACA et à l’ISEN à Toulon * * * * *

3 réflexions au sujet de « Une fonction renvoyant une série sous forme de table »

  1. Avatar de sqlprosqlpro Auteur de l’article

    Pour l’incrément, c’est effectivement nouveau sous SQL Server 2008.

    Pour numérotez vos lignes il y a plus simple et plus efficace :

    CREATE TABLE PAYS (Nom_Pays VARCHAR(16))&nbsp;<br />
    &nbsp;<br />
    INSERT INTO PAYS VALUES ('France')&nbsp;<br />
    INSERT INTO PAYS VALUES ('Italie')&nbsp;<br />
    INSERT INTO PAYS VALUES ('Pays-Bas')&nbsp;<br />
    INSERT INTO PAYS VALUES ('Espagne')&nbsp;<br />
    INSERT INTO PAYS VALUES ('Allemagne')&nbsp;<br />
    INSERT INTO PAYS VALUES ('Maroc')&nbsp;<br />
    INSERT INTO PAYS VALUES ('Algérie')&nbsp;<br />
    &nbsp;<br />
    SELECT ROW_NUMBER() OVER(ORDER BY Nom_Pays) + 6 AS N, &nbsp;<br />
    &nbsp;      Nom_Pays&nbsp;<br />
    FROM   PAYS&nbsp;<br />
    &nbsp;<br />
    N                    Nom_Pays&nbsp;<br />
    -------------------- ----------------&nbsp;<br />
    7                    Algérie&nbsp;<br />
    8                    Allemagne&nbsp;<br />
    9                    Espagne&nbsp;<br />
    10                   France&nbsp;<br />
    11                   Italie&nbsp;<br />
    12                   Maroc&nbsp;<br />
    13                   Pays-Bas

    A +

  2. Avatar de MatthieuQMatthieuQ

    Bonjour,

    Je suis sous SQL Server Express 2005.
    J’ai tenté de créer cette fonction mais j’ai dû la modifier pour qu’elle soit acceptée.

    BEGIN
    INSERT INTO @T VALUES (@I);
    => SET @I = @I + 1;
    END

    Je suppose que votre code fonctionne très bien avec SQL Server 2008.

    Ma question est la suivante :
    Est-il possible d’utiliser cette fonction au sein d’une requête SQL SELECT qui appelle une autre table ?

    En reprenant votre exemple (7 valeurs renvoyées), si je veux numéroter 7 pays extraits de ma table PAYS en commençant par la valeur 7 et obtenir le résultat suivant :

    I Nom_Pays
    —————
    7 France
    8 Italie
    9 Pays-Bas
    10 Espagne
    11 Allemagne
    12 Maroc
    13 Algérie

    Existe-t-il une requête de ce type ?
    SELECT TOP 7 F_T_GET_SERIE (7, 13), Nom_Pays FROM PAYS

    Par avance, merci de votre réponse.

Laisser un commentaire