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 :

SQL dynamique dans une fonction définie par l'utilisateur


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 35
    Points : 34
    Points
    34
    Par défaut SQL dynamique dans une fonction définie par l'utilisateur
    j'ai une fonction dans un module vba d'une application Access

    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
    Public Function F_LCT_I(p_table As String, p_cmp_cln As String, _
                    p_res_cln As String, p_entree As String) As Integer
    'Fonction (getter) de lecture
    'p_table : nom de table
    'p_cmp_cln : nom de colonne de comparaison
    'p_res_cln : nom de colonne du résultat
    'p_entree : paramètre de comparaison
     
    On Error GoTo errhandler
        'Déclaration de variables
    Dim rs As Recordset
       'Test de nullité du paramètre en entrée
    If IsNull(p_entree) = True Then
        F_LCT_I = ""
        Exit Function
    End If
        'Ouverture du RecordSet
    Set rs = CurrentDb.OpenRecordset("SELECT " & p_res_cln _
                                    & " FROM " & p_table _
                                    & " WHERE " & p_cmp_cln & "='" & p_entree & "'")
        'Récupération de la donnée et affectation
    F_LCT_I = rs.Fields(0).Value
        'Fermeture du Recordset
    rs.Close
    Set rs = Nothing
    Exit Function
     
    errhandler:
       'Traitement des exceptions
       With Err
          MsgBox "Error " & .Number & vbCrLf & .Description, _
                vbOKOnly Or vbCritical, p_table
       End With
    End Function
    Après une migration sur MS SQL SERVER 2005, je souhaiterai implémenter la même fonction en T-SQL.
    En consultant la documentation, j'apprends que du SQL dynamique peut être peut être passé à une procédure stockée intégrée sp_executesql. Mais que celle-ci:
    1. ne peut pas être utilisée dans une fonction UDF.
    2. on ne peut pas lui passer le nom d'une table en paramètre

    You may wonder why I do not pass @tbl as a parameter as well. The answer is that you can't. Dynamic SQL is just like any other SQL. You can't specify a table name through a variable in T-SQL, that's the whole story. Thus, when you need to specify things like table names, column names etc dynamically, you must interpolate them into the string.
    source: http://www.sommarskog.se/dynamic_sql.html
    Est-il possible d'implémenter cette fonction en T-SQL?
    Merci d'avance.

  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 770
    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 770
    Points : 52 726
    Points
    52 726
    Billets dans le blog
    5
    Par défaut
    Il n'est pas possible d'utiliser du SQL Dynamique dans une fonction (UDF) SQL.
    Lisez l'article que j'ai écrit à ce sujet :
    http://blog.developpez.com/sqlpro/p6...la-difference/

    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
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par messalux Voir le message
    Est-il possible d'implémenter cette fonction en T-SQL?
    Merci d'avance.
    Il suffit de l'implémenter sous forme d'une procédure stockée en T-SQL.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 35
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Il suffit de l'implémenter sous forme d'une procédure stockée en T-SQL.
    merci pour vos réponses, mais je ne sais pas comment utiliser un paramètre de sortie (output) d'une procédure dans une requête sql.

  5. #5
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par messalux Voir le message
    merci pour vos réponses, mais je ne sais pas comment utiliser un paramètre de sortie (output) d'une procédure dans une requête sql.

    L'utliser comment ? depuis le code client ?

    Un exemple :

    Une proc stoc avec OUTPUT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CREATE PROCEDURE [dbo].[sp_testInputOutput]
    @input1 varchar(MAX)
    ,@output1 varchar(MAX) OUTPUT
    ,@output2 varchar(MAX) OUTPUT
    AS
    BEGIN
    set @output1 = 'HELLO WORLD'
    set @output2 = 'ENTRY VALUE ' + @input1 
    END
    Appel de la proc stoc depuis du code client :

    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
     
    string connectionString = "Server=localHost;Database=MYBASE;Trusted_Connection=True;";
    using (SqlConnection connection = newSqlConnection(connectionString))
    {
    connection.Open();
    using (SqlCommand command = connection.CreateCommand())
    {
    command.CommandText = "sp_testInputOutput";
    command.CommandType = System.Data.CommandType.StoredProcedure;
    // param entr‚e 
    command.Parameters.AddWithValue("@input1", "test");
    // params en sortie
    SqlParameter paramOutput1 = command.Parameters.Add("@output1", System.Data.SqlDbType.VarChar, 100);
    paramOutput1.Direction = System.Data.ParameterDirection.Output;
    SqlParameter paramOutput2 = command.Parameters.Add("@output2", System.Data.SqlDbType.VarChar, 100);
    paramOutput2.Direction = System.Data.ParameterDirection.Output;
    command.ExecuteNonQuery();
    Console.WriteLine(paramOutput1.Value);
    Console.WriteLine(paramOutput2.Value);
    }
    connection.Close();
    }

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 35
    Points : 34
    Points
    34
    Par défaut
    j'utilise cette fonction pour faire des lectures dans les tables de codification pour éviter les jointures et faciliter la maintenance.
    Ainsi, si on a une table TABLE1 (col1, col2,...,CODPAY,...), et on veut avoir le libéllé du pays à partir de la table PAYS.

    exemple: table PAYS
    CODPAY PAYS NATIONALITE
    93 AFGHANISTAN AFGHANE
    27 AFRIQUE DU SUD SUD-AFRICAINE
    355 ALBANIE ALBANAISE
    213 ALGERIE ALGERIENNE
    49 ALLEMAGNE ALLEMANDE
    376 ANDORRE ANDORRANE
    ...etc
    pour les besoins d'affichage des formulaires et états liés à la table TABLE1, j'utilise la fonction F_LCT_I dans leurs sources de données:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT	col1,col2,...,F_LCT_I('PAYS','CODPAY','PAYS',CODPAY)
    FROM	TABLE1
    l'avantage de cette fonction est dans le fait qu'elle soit générique, sinon on serait obligé de la coder en dur, et ce pour chaque table pour chacune des colonnes dont on a besoin.

    donc la question est de savoir s'il est possible de faire ça avec une procédure.

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 770
    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 770
    Points : 52 726
    Points
    52 726
    Billets dans le blog
    5
    Par défaut
    Utilisez des vues, cela sera plus performant et plus simple !

    Tout ce qui est itératif (fonction en particulier), n'est pas optimisable.

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

  8. #8
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 35
    Points : 34
    Points
    34
    Par défaut
    Merci

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

Discussions similaires

  1. [2005] Invoquer une fonction définie par l'utilisateur dans un ordre SQL
    Par Pozzo dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 13/02/2014, 10h08
  2. Réponses: 10
    Dernier message: 02/02/2007, 00h02
  3. SQL dynamique dans une procédure stockée
    Par Amnesiak dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/07/2005, 15h17
  4. variable dynamique dans une fonction javascript
    Par Shivaneth dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/04/2005, 15h58
  5. SQL Server / Fonction définie par l'utilisateur
    Par borgfabr dans le forum Langage SQL
    Réponses: 3
    Dernier message: 08/03/2005, 15h14

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