Article complet: Une fonction renvoyant une série sous forme de table

22/03/2009

Permalink 10:44:38, Catégories: Langage SQL (norme), MS SQL Server, Récapitulatif SGBD, SQL Server, 238 mots   French (FR) , sqlpro

[SGBD][SQL Server] 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...

[Suite:]

-- 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 * * * * *

Social Bookmarking:

                                     

Commentaires, Pingbacks:

Connectez-vous pour vous abonner à cet article:

Flux de commentaires pour cet article : Atom 1.0  RSS 2.0
Commentaire de: MatthieuQ [Membre]
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.
Permalien 25/03/2009 @ 11:41
Commentaire de: sqlpro [Membre] · http://sqlpro.developpez.com
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)) 
 
INSERT INTO PAYS VALUES ('France') 
INSERT INTO PAYS VALUES ('Italie') 
INSERT INTO PAYS VALUES ('Pays-Bas') 
INSERT INTO PAYS VALUES ('Espagne') 
INSERT INTO PAYS VALUES ('Allemagne') 
INSERT INTO PAYS VALUES ('Maroc') 
INSERT INTO PAYS VALUES ('Algérie') 
 
SELECT ROW_NUMBER() OVER(ORDER BY Nom_Pays) + 6 AS N,  
  Nom_Pays 
FROM PAYS 
 
N Nom_Pays 
-------------------- ---------------- 
7 Algérie 
8 Allemagne 
9 Espagne 
10 France 
11 Italie 
12 Maroc 
13 Pays-Bas


A +

Permalien 25/03/2009 @ 23:14
Commentaire de: MatthieuQ [Membre]
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.
Permalien 26/03/2009 @ 09:04

Vous devez être identifié pour poster un commentaire.

Liste des blogs

< Le blog de SQLpro/>

Fred Brouard alias SQLpro

Rechercher

<  Novembre 2011  >
Lun Mar Mer Jeu Ven Sam Dim
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        

Syndiquez ce blog XML

Articles :

Commentaires :

 
 
 
 
Partenaires

Hébergement Web