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