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 :

Probleme fonction sql server [2008]


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Inscrit en
    Mai 2013
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 128
    Par défaut Probleme fonction sql server
    bonjour tout le monde je sais pas pourquoi cette fonction ne donne pas la valeur retourné qui est un varchar


    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 testdommage(
    @somtotal real
    )
    returns varchar(25)
    as
    begin
    declare @chaineretourner varchar(25)
    if (@somtotal <=5000)
     
    set @chaineretourner='Categorie1'
     
    if (@somtotal >=5000 and @somtotal<=10000)
    set @chaineretourner='Categorie2'
    if(@somtotal>10000)
    set @chaineretourner='Categorie3'
    return  @chaineretourner
     
    end
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select testdommage(100)
    normalement doit retourné categorie 1
    l'erreur c'est

    Msg 195, Level 15, State 10, Line 1

    'testdommage' is not a recognized built-in function name.


    :'(o_O

  2. #2
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Hello

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT dbo.testdommage(100)
    Le nom du schéma est important ici.

    ++

  3. #3
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Par curiosité, y a-t-il un moyen de faire en sorte que le schéma ne soit pas nécessaire ?

    Maintenant j'y suis habitué mais je me souviens que cela m'avait aussi pris la tête à mes débuts ^^.

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Pour ce type de fonction, vous devriez utiliser un fonction table en ligne, nettement plus performante :

    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
     
     
    CREATE FUNCTION dbo.testdommage
    (	
    	@somtotal REAL
    )
    RETURNS TABLE 
    WITH SCHEMABINDING
    AS
    RETURN 
    (
    	SELECT CAST (
    		CASE 
    			WHEN @somtotal < 500 THEN 'categorie 1'
    			WHEN @somtotal <= 10000 THEN 'categorie 2'
    			WHEN @somtotal > 10000 THEN 'categorie 3'
    		END
    		AS VARCHAR(25)
    	) AS Result
    )

  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,

    Cela étant, sachez que les fonctions scalaires sont contre-performantes, puisqu'elles sont appelées autant de fois qu'il y a de lignes dans votre résultat. Ce fonctionnement n'est donc pas ensembliste comme l'est SQL et le moteur de SQL Server, et vous conduira tôt ou tard à des problèmes de performance.

    Vous pouve, pour éviter ce désagrément, intégrer ceci directement dans la requête qui appelle la fonction, en la remplaçant par exemple par le code qui suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT	CASE 
    		WHEN colonneOuExpressionSomTotal <= 5000 THEN 'Categorie1'
    		WHEN colonneOuExpressionSomTotal >= 5000 AND colonneOuExpressionSomTotal <= 10000 THEN 'Categorie2'
    		ELSE 'Categorie3'
    	END
    	, autresColonnes
    FROM	...
    Si cela ne vous est pas possible pour une quelconque raison, vous pouvez allègrement transformer votre fonction scalaire en fonction de table en ligne; utilisée en conjonction avec APPLY ou dans une sous-requête corrélée, c'est le seul type de fonction qui est exécuté de façon ensembliste : elle est appelée une seule fois pour l'ensemble des lignes retournées par la requête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE FUNCTION testDommage (@som_total real)
    	RETURNS TABLE 
    AS
    RETURN (
    	SELECT CASE 
    		WHEN @som_total <= 5000 THEN 'Categorie1'
    		WHEN @som_total >= 5000 AND @som_total <= 10000 THEN 'Categorie2'
    		ELSE 'Categorie3'
    	END AS chaine_a_retourner
    	)
    Puis dans votre requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT		T.desColonnes
    		, ...
    		, TD.chaine_a_retourner
    FROM		dbo.desTables AS T
    CROSS APPLY	dbo.testDommage(T.uneColonne) AS TD
    Enfin, une dernière possibilité est de créer une table utilitaire avec une colonne pour la borne basse, une autre pour la borne haute, et une dernière pour le libellé de la catégorie : vous spécifiez ensuite la jointure entre la colonne que vous passez actuellement en paramètre à la fonction avec un prédicat BETWEEN.

    @++

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

Discussions similaires

  1. probleme installation? sql server express
    Par popachubby dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 21/09/2006, 13h09
  2. Probleme Administration SQL SERVER
    Par flox dans le forum Administration
    Réponses: 2
    Dernier message: 01/08/2006, 10h54
  3. problème migration sql server -> mysql
    Par LostIN dans le forum Outils
    Réponses: 5
    Dernier message: 31/07/2006, 11h19
  4. probleme php sql server
    Par flydragon dans le forum Apache
    Réponses: 1
    Dernier message: 25/05/2006, 20h21
  5. tres urgent : probleme avec sql server
    Par nourelhouda dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/03/2006, 11h19

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