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 * * * * *
J’étais arrivé en fin de journée à cette technique mais sans le « +6″. Je ne savais pas que l’on pouvait additionner le row_number()
Merci.
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 :
<br />
INSERT INTO PAYS VALUES ('France') <br />
INSERT INTO PAYS VALUES ('Italie') <br />
INSERT INTO PAYS VALUES ('Pays-Bas') <br />
INSERT INTO PAYS VALUES ('Espagne') <br />
INSERT INTO PAYS VALUES ('Allemagne') <br />
INSERT INTO PAYS VALUES ('Maroc') <br />
INSERT INTO PAYS VALUES ('Algérie') <br />
<br />
SELECT ROW_NUMBER() OVER(ORDER BY Nom_Pays) + 6 AS N, <br />
Nom_Pays <br />
FROM PAYS <br />
<br />
N Nom_Pays <br />
-------------------- ---------------- <br />
7 Algérie <br />
8 Allemagne <br />
9 Espagne <br />
10 France <br />
11 Italie <br />
12 Maroc <br />
13 Pays-Bas
A +
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.