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 :

Problème insertion fonction scalaire dans l'arbre des fonctions scalaires


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2014
    Messages : 31
    Points : 32
    Points
    32
    Par défaut Problème insertion fonction scalaire dans l'arbre des fonctions scalaires
    Bonjour,

    Je cherche à créer une fonction scalaire qui sera appelée depuis un programme tiers. Pour ce faire dans sqlserver management studio (je suis en version 2014) je déroule l'arbre programmabilité/fonction, je fais un clic droit sur Fonctions scalaires puis Nouvelle fonction scalaire.

    Ce qui me donne ce template :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    -- ================================================
    -- Template generated from Template Explorer using:
    -- Create Scalar Function (New Menu).SQL
    --
    -- Use the Specify Values for Template Parameters 
    -- command (Ctrl-Shift-M) to fill in the parameter 
    -- values below.
    --
    -- This block of comments will not be included in
    -- the definition of the function.
    -- ================================================
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:		<Author,,Name>
    -- Create date: <Create Date, ,>
    -- Description:	<Description, ,>
    -- =============================================
    CREATE FUNCTION <Scalar_Function_Name, sysname, FunctionName> 
    (
    	-- Add the parameters for the function here
    	<@Param1, sysname, @p1> <Data_Type_For_Param1, , int>
    )
    RETURNS <Function_Data_Type, ,int>
    AS
    BEGIN
    	-- Declare the return variable here
    	DECLARE <@ResultVar, sysname, @Result> <Function_Data_Type, ,int>
     
    	-- Add the T-SQL statements to compute the return value here
    	SELECT <@ResultVar, sysname, @Result> = <@Param1, sysname, @p1>
     
    	-- Return the result of the function
    	RETURN <@ResultVar, sysname, @Result>
     
    END
    GO
    Je rajoute dans ce template ce que je veux faire (pour le moment pour le test c'est juste une selection de nom et prenom :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    -- ======================================================================
    -- A partir de l'UID de l'utilisateur on récupère son nom et son prénom
    -- On construit un mot de passe en selectionnant :
    -- 3 caractères dans le prénom + 3 caractères dans le nom + 
    -- un nombre aléatoire + un caractère spécial aléatoire 
    -- ======================================================================
    USE XXX;
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
     
    -- =============================================
    -- Author:		<XXXXX>
    -- Create date: <23/09/2016>
    -- Description:	<Fonction permettant de générer un mot de passe simple>
    -- =============================================
     
    CREATE FUNCTION dbo.fctGetMdpSilpc 
    (
    	@_uid nvarchar(450)
    )
    RETURNS varchar(9)
    AS
    BEGIN
    	-- Déclaration des variables
    	DECLARE @nom varchar(32)
    	DECLARE @prenom varchar(32)
    	DECLARE @carspe varchar(1)
    	DECLARE @mdp varchar(9)
    	DECLARE @nbalea varchar(2)
     
    	-- selection des noms et prénoms
    	Select @nom = personne_nom, @prenom = personne_prenom
    	From dbo.PERSONNE
    	where personne_uid = @_uid
     
     
    	-- Return the result of the function
    	RETURN @nom
     
    END
    GO
    Or quand j'enregistre il me propose de stocker cela dans un fichier .sql là où j'ai tous mes scripts de déjà enregistré. Après l'enregistrement je ne vois pas apparaître ma fonction dans l'arbre des fonctions scalaires.

    Quel est la manipulation a effectuer pour que ma fonction s'enregistre bien dans les fonctions scalaires ?

    Merci d'avance.

  2. #2
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 89
    Points : 117
    Points
    117
    Par défaut
    Bonjour,

    Pour lancer le script, il faut cliquer sur "Exécuter" ou F5 au clavier
    L'enregistrement ne sert effectivement qu'à sauvegarder le script de la fonction.

    + tant qu'à faire pour ce genre de choses, un petit IF EXISTS... ou un ALTER à la place du CREATE sont souvent plus sympas à l'usage.

    HTH,

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2014
    Messages : 31
    Points : 32
    Points
    32
    Par défaut
    Merci, c'est parfait.

    A quoi va me servir le IF exists ou le alter ?

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 89
    Points : 117
    Points
    117
    Par défaut
    Je ne sais pas ce qu'en pensent les puristes mais je n'aime pas les messages d'erreur

    Si la fonction existe et que je lance un CREATE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Msg 2714, Niveau 16, État 3, Procédure fctGetMdpSilpc, Ligne 8 [Ligne de départ du lot 10]
    Il existe déjà un objet nommé 'fctGetMdpSilpc' dans la base de données.
    Donc si je SAIS que ma fonction / procédure existe, je passe par un ALTER pour toutes les modifs.
    Mais si elle n'existe pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Msg 208, Niveau 16, État 6, Procédure fctGetMdpSilpc, Ligne 8 [Ligne de départ du lot 10]
    Nom d'objet 'dbo.fctGetMdpSilpc' non valide.
    Un peu plus contraignant en conception (les clauses diffèrent en fonction du type d'objet à gérer), mais un DROP / CREATE avec test d'existence passe tout le temps sans erreur, et de mon point de vue revient au même pour une fonction / une PS.
    Après je suis peut-être un peu trop influencé par le fait que je transpose souvent mes petits objets personnels d'un client à l'autre.
    En tout état de cause les messages sont explicites

    Bref j'ai inséré le test au début du script, ce qui donne donc :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    -- ======================================================================
    -- A partir de l'UID de l'utilisateur on récupère son nom et son prénom
    -- On construit un mot de passe en selectionnant :
    -- 3 caractères dans le prénom + 3 caractères dans le nom + 
    -- un nombre aléatoire + un caractère spécial aléatoire 
    -- ======================================================================
    USE XXX;
     
    -- Suppression de l'éventuel existant
    IF EXISTS (SELECT *
               FROM   sys.objects
               WHERE  object_id = OBJECT_ID(N'[dbo].[fctGetMdpSilpc]')
                      AND type IN ( N'FN', N'IF', N'TF', N'FS', N'FT' )) --
      DROP FUNCTION [dbo].[fctGetMdpSilpc]
    GO
     
    -- Création de la fonction
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
     
    -- =============================================
    -- Author:		<XXXXX>
    -- Create date: <23/09/2016>
    -- Description:	<Fonction permettant de générer un mot de passe simple>
    -- =============================================
     
    CREATE FUNCTION dbo.fctGetMdpSilpc 
    (
    	@_uid nvarchar(450)
    )
    RETURNS varchar(9)
    AS
    BEGIN
    	-- Déclaration des variables
    	DECLARE @nom varchar(32)
    	DECLARE @prenom varchar(32)
    	DECLARE @carspe varchar(1)
    	DECLARE @mdp varchar(9)
    	DECLARE @nbalea varchar(2)
     
    	-- selection des noms et prénoms
    	Select @nom = personne_nom, @prenom = personne_prenom
    	From dbo.PERSONNE
    	where personne_uid = @_uid
     
     
    	-- Return the result of the function
    	RETURN @nom
     
    END
    GO

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    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 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    Pas besoin d'indiquer le type. La combinaison nom schéma / nom objet est unique....

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

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 18/04/2016, 14h32
  2. Réponses: 2
    Dernier message: 10/12/2013, 09h42
  3. Valeur des champs dans l'arbre des composants
    Par mymyma dans le forum JSF
    Réponses: 2
    Dernier message: 06/07/2006, 11h19
  4. Réponses: 6
    Dernier message: 22/05/2006, 13h54
  5. Appel à des fonctions incluses dans des DLL
    Par Greybird dans le forum Langage
    Réponses: 3
    Dernier message: 26/05/2003, 13h33

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