IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

La Fonction count


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2010
    Messages : 71
    Par défaut La Fonction count
    Bonjour,
    est que vous pouvez m'aider pour ecrire une fonction avec l'instruction CREATE FUNCTION comme la fonction d'agregation COUNT.
    Merci.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 999
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 999
    Billets dans le blog
    6
    Par défaut
    Vous ne pouvez pas créer des fonctions d'agrégation en transact SQL.
    Pour créer des fonctions d'agrégation, il faut les coder en .net.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    31
    using System;
    using System.Data;
    using System.Data.SqlClient;
    using System.Data.SqlTypes;
    using Microsoft
    .SqlServer.Server;
    using Microsoft.SqlServer.Server;
    [Serializable]
    [SqlUserDefinedAggregate(Format.Native,Name = "AggreagateAny")]
    public struct AggreagateAny
    {
        private int Counter;  // compteur
        public void Init()
        {
            Counter = 1;      // initialisation
        }
        public void Accumulate(object Value)
        {
            if (Value == 0)  // si zero, met 0
                Counter = 0;
        }
        public void Merge(Count0 Group)
        {
            this.Counter =  this.Counter * Group.Counter; // a la fusion on multiplie
        }
     
        public SqlString Terminate()
        {
            return new SqlString(Counter.ToString()); //retourne le résultats
        }
    }
    Puis construire la DDL et l'intégrer en transaction SQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE ASSEMBLY ....
     
    CREATE AGGREGATE UDA_ANY (@bool BIT)
    RETURNS BIT
    EXTERNAL NAME ...
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2010
    Messages : 71
    Par défaut
    Est ce que une fonction dans le T-SQL peut prendre une table comme un paramètre d’entrée?
    donner un exemple s'il vous plaît.
    et Merci M.SqlPro

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 999
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 999
    Billets dans le blog
    6
    Par défaut
    Non.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    C'est possible avec les paramètres de type TABLE introduits avec SQL Server 2008.
    Pour faire cela vous devez d'abord créer votre type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TYPE dbo.table_valued_parameter
    AS TABLE
    (
    	col1 INT
    )
    Et voici une fonction pour l'exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    CREATE FUNCTION dbo.fn_tvp
    	(@tvp table_valued_parameter READONLY)
    	RETURNS bit
    AS
    BEGIN
    	DECLARE @b bit = 0
     
    	IF EXISTS
    	(
    		SELECT	*
    		FROM	@tvp
    		WHERE	col1 = 0
    	)
    	SET @b = 1
     
    	RETURN @b
    END
    Voici un exemple d'utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DECLARE @tvp dbo.table_valued_parameter
     
    INSERT INTO @tvp VALUES (1), (2), (3)
     
    SELECT dbo.fn_tvp(@tvp)
    Retourne 0.

    Mais je ne les utiliserai pas pour deux raisons :

    - Les fonctions définies par l'utilisateur sont contre-performantes parce qu'elles ne sont pas ensemblistes.
    En effet, elles sont appelées pour chaque ligne du résultat.

    - la variables de type TABLE ont un cardinal qui est toujours estimé à 1, ce qui peut rendre votre requête contre-performante, surtout si vous y stockez un grand nombre de valeurs.

    Vous pouvez vous passez de cela, surtout dès SQL Server 2005 qui a introduit les expressions de table commune (CTE dans la littérature).

    Dites-nous en plus sur ce que vous avez besoin d'implémenter; je suis sûr que nous trouverons une meilleure solution que la fonction

    @++

  6. #6
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2010
    Messages : 71
    Par défaut
    Merci beaucoup M. elsuket,

    j'ai choisi les fonctions parce que je veux un objet qui accepte le nom d'une table ou bien la table elle-même et un nombre entier, pour retourner le nombre de lignes de cette table.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. DBI fonction count()
    Par vodevil dans le forum SGBD
    Réponses: 2
    Dernier message: 21/04/2006, 11h53
  2. Une requête, deux tables, fonction COUNT
    Par Nerva dans le forum Requêtes
    Réponses: 8
    Dernier message: 13/04/2006, 15h10
  3. Coupler les fonction COUNT et MAX
    Par Pascal Lob dans le forum Langage SQL
    Réponses: 5
    Dernier message: 27/03/2006, 09h45
  4. fonction count dans des paramètres
    Par flo456 dans le forum ASP
    Réponses: 11
    Dernier message: 18/11/2005, 08h33
  5. Requête à plusieurs colonnes avec la fonction COUNT
    Par zigune dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/11/2004, 10h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo