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

Développement SQL Server Discussion :

Question sur les fonctions avec "TABLE" comme param. de retour


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 66
    Points : 45
    Points
    45
    Par défaut Question sur les fonctions avec "TABLE" comme param. de retour
    Bonjour à toutes et à tous,

    Je viens de chercher pendant un long moment à faire fonctionner le code qui suit :

    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
     
    CREATE FUNCTION dbo.ConfirmMotDePasse2
    (
        @N_User varchar(100),
        @Equipe varchar(20),
        @Pass varchar(20)
    )
    RETURNS @MaTable TABLE(Nb int)
    AS
    BEGIN
        IF (@Equipe is NOT NULL)
    		BEGIN
            	insert into @MaTable(Nb) SELECT COUNT(password) FROM T_utilisateur_L1
      			WHERE Nom_user = @N_User
      			AND Lettre_equipe = @Equipe
      			AND password = @Pass
    		END;
        ELSE
        	BEGIN
          		insert into @MaTable(Nb) SELECT COUNT(password) FROM TUtilisateur
          		WHERE Nom_user = @N_User
          		AND Lettre_equipe is null
          		AND password = @Pass
        	END
    RETURN;
    END
    Mais je ne comprend pas pourquoi celui-ci ne fonctionnait pas :

    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
     
    CREATE FUNCTION dbo.ConfirmMotDePasse2
    (
        @N_User varchar(100),
        @Equipe varchar(20),
        @Pass varchar(20)
    )
    RETURNS TABLE
    AS
    BEGIN
        IF (@Equipe is NOT NULL)
    	BEGIN
            	     SELECT COUNT(password) FROM Tutilisateur
      	     WHERE Nom_user = @N_User
      	     AND Lettre_equipe = @Equipe
      	     AND password = @Pass
    	END;
        ELSE
        	BEGIN
          		SELECT COUNT(password)   FROM TUtilisateur
          		WHERE Nom_user = @N_User
          		AND Lettre_equipe is null
          		AND password = @Pass
        	END
    RETURN;
    END
    Alors que le code suivant, plus simple, mais écrit différemment, fonctionne également :
    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
     
    CREATE FUNCTION dbo.ConfirmMotDePasse 
    (
        @N_User varchar(100),
        @Equipe varchar(20),
        @Pass varchar(20)
    )
    RETURNS TABLE
    AS
    RETURN
    (
      SELECT COUNT(password) as Nb FROM TUtilisateur
      WHERE Nom_user = @N_User
      AND Lettre_equipe = @Equipe
      AND password = @Pass
    )
    Quelqu'un peut t'il m'expliquer pourquoi dans un cas il faut déclarer la table de retour et pas dans l'autre ?

    D'avance merci,
    Cordialement,
    Alex01

  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 838
    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 838
    Points : 52 931
    Points
    52 931
    Billets dans le blog
    5
    Par défaut
    Une fonction table peut s'écrire de deux manières :

    1) table en ligne => une seule instruction SELECT qui renvoie la table

    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
    CREATE FUNCTION dbo.ConfirmMotDePasse2
    (
        @N_User varchar(100),
        @Equipe varchar(20),
        @Pass varchar(20)
    )
    RETURNS TABLE
    AS
    RETURN
    (SELECT COUNT(password) FROM Tutilisateur
     WHERE Nom_user = @N_User
       AND COALESCE(Lettre_equipe, '') =
               CASE 
                  WHEN Lettre_equipe IS NOT NULL THEN @Equipe
                  ELSE '' 
               END
       AND password = @Pass
    );
    2) table multi instruction => plusieurs instructions : INSERT, UPDATE effectués sur la variable table mais pas de SELECT final puisque c'est la variable table qui est renvoyée par un SELECT * (invisible)

    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
    CREATE FUNCTION dbo.ConfirmMotDePasse2
    (
        @N_User varchar(100),
        @Equipe varchar(20),
        @Pass varchar(20)
    )
    RETURNS @MaTable TABLE(Nb int)
    AS
    BEGIN
     
    INSERT INTO @MaTable 
    SELECT COUNT(password) 
    FROM T_utilisateur_L1
    WHERE Nom_user = @N_User
      AND Lettre_equipe = @Equipe
      AND password = @Pass
      AND @Equipe IS NOT NULL;
     
    INSERT INTO @MaTable 
    SELECT COUNT(password) 
    FROM T_utilisateur_L1
    WHERE Nom_user = @N_User
      AND Lettre_equipe = IS NULL
      AND password = @Pass
      AND @Equipe IS NULL;
     
    RETURN;
     
    END
    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 du Club
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 66
    Points : 45
    Points
    45
    Par défaut
    Merci beaucoup 'SQLpro' pour la réponse.

    Cordialement
    Alex01

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

Discussions similaires

  1. Question sur les pointeurs avec les fonctions
    Par Loester dans le forum Débuter
    Réponses: 2
    Dernier message: 01/02/2012, 22h56
  2. Réponses: 3
    Dernier message: 23/08/2007, 00h39
  3. [Dates] Question sur les fonctions Date
    Par cerede2000 dans le forum Langage
    Réponses: 2
    Dernier message: 28/10/2006, 17h26
  4. Question sur les fonctions "send()" et "recv(
    Par damien99 dans le forum MFC
    Réponses: 6
    Dernier message: 10/02/2006, 20h47

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