Discussion: SQL set= variable nom

  1. #1
    Candidat au Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    juillet 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Finance

    Informations forums :
    Inscription : juillet 2017
    Messages : 5
    Points : 2
    Points
    2

    Par défaut SQL set= variable nom

    Bonjour,

    Je débute sur ce forum. Je rencontre un souci tout bête, je souhaite exécuter une requête avec la condition WHERE qui renvoi à une saisi de l'utilisateur. Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    declare @debut_nom_table varchar(10) 
    set @debut_nom_table  = @BASE
    
    declare @NOM varchar(100) 
    set @NOM  =  @NAME 
    
    declare @requete_test varchar(MAX)
    
    set @requete_test = 'select * FROM ' + @debut_nom_table + '_PERSONNE WHERE NOM_PERS=' + @NOM
    
    exec (@requete_test)

    L'utilisateur doit juste saisir le nom de la société (@debut_nom_table) et le nom de la personne (@NOM) pour avoir les info.
    -Pour @debut_nom_table, on peut saisir sans apostrophe et ça fonctionne.
    -Par contre pour @NOM, on doit saisir avec des apostrophes sinon ça fonctionne pas (car c'est un champ type texte).


    Comment peut-on faire afin d'éviter que l'utilisateur n'a pas à saisir les apostrophes? genre il a juste à taper le nom DUPOND et non 'DUPOND'


    Merci d'avance pour votre aide précieuse

  2. #2
    Membre chevronné
    Inscrit en
    août 2009
    Messages
    1 071
    Détails du profil
    Informations forums :
    Inscription : août 2009
    Messages : 1 071
    Points : 1 804
    Points
    1 804

    Par défaut

    Bonjour,

    1. Il faudrait commencer par donner le SGBD. Ici je pense qu'il s'agit de SQL Server, vu la syntaxe.

    2. Laisser les utilisateurs piloter ainsi la requête est dangereux, j'espère que vous faites des tests sur les variables (sinon, faites une petite recherche sur l'injection SQL).

    3. Avoir une table par société est particulièrement moche, vous devriez avoir une seule table, avec une colonne société.

    4. Utilisez sp_executesql :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     EXEC sp_executesql N'SELECT @test', N'@test nvarchar', @test=1

  3. #3
    Expert éminent

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    2 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 2 966
    Points : 6 525
    Points
    6 525
    Billets dans le blog
    1

    Par défaut

    J'abonde totalement dans le sens des remarques qui précèdent, et j'ajoute que faire un select '*' est dangereux car le résultat est soumis aux aléas de modification de la table et le plus souvent inutile car vous transportez des colonnes dont vous n'avez probablement que faire.

  4. #4
    Candidat au Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    juillet 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Finance

    Informations forums :
    Inscription : juillet 2017
    Messages : 5
    Points : 2
    Points
    2

    Par défaut

    Bonjour,

    Oui il s'agit du SQL Server.

    Dans mon entreprise, chaque BU on leur propre serveur où est installé l'outil comptable...
    Cet outil nomme ses tables commençant pas le nom de la BU+Nom de la table.

    Ces requêtes sont des tests (d'où "*") qui me permettra de construire un rapport avec Visual studio que je les déploierai sur différents serveurs.

    Merci pour votre aide. Je vais tester le code et je vous dirai si cela marche

  5. #5
    Candidat au Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    juillet 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Finance

    Informations forums :
    Inscription : juillet 2017
    Messages : 5
    Points : 2
    Points
    2

    Par défaut

    J'ai testé ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    EXECUTE sp_executesql 
              N'select * FROM ' + @debut_nom_table + 'PERSONNE WHERE NOM_PERS=@NOM' ,
              N'@NOM nvarchar',
              @NOM = 1;
    Mais ça ne marche pas. Erreur au niveau de ' + @debut_nom_table + ' dont je ne sais pas résoudre

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    janvier 2010
    Messages
    4 540
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : janvier 2010
    Messages : 4 540
    Points : 9 189
    Points
    9 189

    Par défaut

    Bonjour,

    Vous ne pouvez pas effectuer la concaténation au moment de l'appel de la procédure sp_executesql.

    Générez votre SQL complet dans une variable puis appelez sp_executesql.

  7. #7
    Candidat au Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    juillet 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Finance

    Informations forums :
    Inscription : juillet 2017
    Messages : 5
    Points : 2
    Points
    2

    Par défaut

    Bonjour,

    J'ai réussi
    Merci beaucoup!

    Voici le code que j'ai fait:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DECLARE @sqlCommand nvarchar(1000)
    DECLARE @columnList varchar(75)
    DECLARE @NOM varchar(75)
    SET @columnList = @BU
    SET @NOM = @NOMPERS
    SET @sqlCommand = 'SELECT * FROM ' + @columnList + 'ERSONNE WHERE NOM_PERS = @NOM'
    EXECUTE sp_executesql @sqlCommand, N'@city nvarchar(75)', @NOM = @NOM


    Je vais pouvoir adapter cet exemple aux rapports souhaités.

    Pas évident lorsqu'on n'a pas du tout de formation en IT/codage (je suis financier de base).


  8. #8
    Rédacteur
    Avatar de SQLpro
    Homme Profil pro
    Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Inscrit en
    mai 2002
    Messages
    17 251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 17 251
    Points : 39 953
    Points
    39 953
    Billets dans le blog
    1

    Par défaut

    Il aurait été mille fois plus intelligent et dix mille fois plus performant de jouer sur les schémas sql que d'utiliser les 10 premiers caractère du nom des tables pour vos bu...
    Le mieux aurait sans doute été d'ajouter une colonne pour vos code bu...
    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...
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

  9. #9
    Candidat au Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    juillet 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Finance

    Informations forums :
    Inscription : juillet 2017
    Messages : 5
    Points : 2
    Points
    2

    Par défaut

    Citation Envoyé par SQLpro Voir le message
    Il aurait été mille fois plus intelligent et dix mille fois plus performant de jouer sur les schémas sql que d'utiliser les 10 premiers caractère du nom des tables pour vos bu...
    Le mieux aurait sans doute été d'ajouter une colonne pour vos code bu...
    En faite le @BU fait référence à une table contenant les codes BU d'une entité.

    Mais bon l'outil INFOR n'a pas été configurer pour être performant. Il est assez mal fichu pour les multi BU:
    - 1 Domaine = 1 Entité (Pays)
    - 1 Entité = multi BU
    - et chaque BU = 1 DB avec le nom en préfixe.

    Ce serai trop simple d'avoir 1 DB avec la colonne BU

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

Discussions similaires

  1. Recupérer Nom d'une Table SQL en Variable
    Par progscoubi dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 11/11/2012, 10h21
  2. Nom de variable = nom de colonne sql
    Par EricGardien dans le forum ASP
    Réponses: 2
    Dernier message: 10/01/2012, 08h50
  3. Requête SQL dynamique avec nom de table dans une variable
    Par jonjack dans le forum SQL Procédural
    Réponses: 9
    Dernier message: 15/09/2011, 14h37
  4. Réponses: 3
    Dernier message: 01/12/2004, 09h43
  5. [SQL SERVER 2000] Noms de variables dynamiques
    Par cassoulet dans le forum MS SQL-Server
    Réponses: 9
    Dernier message: 08/09/2004, 11h44

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