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

MS SQL Server Discussion :

Faire une recherche avec des noms de colonnes et valeurs dynamiques


Sujet :

MS SQL Server

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 72
    Points : 77
    Points
    77
    Par défaut Faire une recherche avec des noms de colonnes et valeurs dynamiques
    Bonjour

    Je recherche actuellement un moyen de faire une requete ou les noms de colonnes et les valeurs recherchées seraient dynamiques.

    Je développe :
    J'ai dans une table 6 colonnes nommées lang_fr, lang_en, lang_es, .... je dois rechercher par exemple un mot dans une colonne (imaginons 'developpement' dans la colonne lang_fr) et trouver son correspondant dans une autre langue (qui est définie par un paramettre externe)

    Je me suis tournée vers une fonction qui possede une requete dynamique qui est la suivante au moment ou j'ecris ces lignes :


    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
    BEGIN
    	-- Declaration
    	DECLARE @ResultatTraduit VARCHAR(max)
    	DECLARE @ResultatOrigine VARCHAR(max)
    	DECLARE @sql VARCHAR(max)
     
    	-- Element a mettre en commentaire à la fin car passerons en paramettre
    	DECLARE @langueCible VARCHAR(7)
    	DECLARE @langueBase VARCHAR(7)
    	DECLARE @motRecherche VARCHAR(max)
    	SET @langueCible  = 'lang_en'
    	SET @langueBase  = 'lang_fr'
    	SET @motRecherche = 'Developpement'
     
    	-- Creation d'un curseur qui va recuperer les données
    	DECLARE get_lines CURSOR FAST_FORWARD FOR
    		SELECT @langueCible, @langueBase FROM t0
     
    	-- Pour le resultat recuperé on l'insere dans @ResultatTraduit et on libere le curseur	
    	OPEN get_lines
    		IF @langueBase = @motRecherche
    			FETCH NEXT FROM get_lines
    			INTO @ResultatTraduitTraduit,  @ResultatOrigine
    	CLOSE get_lines
        DEALLOCATE get_lines
    	 print('----')
    	 print(@ResultatTraduit)
     
    	-- Return the result of the function
    	--RETURN @ResultatTraduit
     
    END
    Le seul resultat que j'obtiens est deux colonnes avec plein de lang_fr dans l'une et plein de lang_en dans l'autre....

    Auriez vous une solution pour que je ne remonter bien que mes 2 valeurs souhaitées ?

    En vous remerciant à l'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 858
    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 858
    Points : 52 999
    Points
    52 999
    Billets dans le blog
    6
    Par défaut
    Il faut utiliser du SQL dynamique. Prenez exemple de la procédure SP_SEARCH_STRING_ANYFIELD
    de ce cours :
    http://sqlpro.developpez.com/cours/s...r/transactsql/
    Au paragraphe 4.3

    A +

  3. #3
    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 : 43
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Essayez ceci :

    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
    CREATE PROCEDURE PsGetTraduction
    	@_langueSource VARCHAR(7),
    	@_langueCible VARCHAR(7),
    	@_motSource VARCHAR(64)
    AS
    BEGIN
    	IF @_langueSource = @_langueCible
    	BEGIN
    		RAISERROR('La langue source et la langue cible ne peuvent pas être identiques', 16, 1)
    	END
     
    	-- Construction de la chaîne de requête
    	DECLARE @sql NVARCHAR(256)
     
    	SET @sql = 'SELECT @langueCibleOUT = ' + @_langueCible
    				' FROM dbo.maTable'
    				' WHERE ' + @_langueSource + ' = @motSourceIN'
     
    	-- Déclaration des paramètres
    	DECLARE @params NVARCHAR(64)
     
    	SET @params = '@motSourceIN NVARCHAR(64), @langueCibleOUT NVARCHAR(7)'
     
    	EXEC maBD.dbo.sp_executeSQL
    					@sql,
    					@params,
    					@motSourceIN = @_motSource,
    					@langueCibleOUT = @_langueCible OUTPUT
     
    	SELECT @_langueSource, @_motSource, @_langueCible
    END
    Je ne vois pas l'intérêt du curseur dans votre cas, et pour des raisons de performances, vous ne devriez jamais en utiliser

    @++

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 72
    Points : 77
    Points
    77
    Par défaut
    En premier lieu : merci beaucoup SQLpro et elsuket pour vos réponses

    Le lien que vous me donnez est très utile et je sens que je vais le potasser un peu

    @elsuket

    J'ai étudié vos sources et je les ai modifiés pour les tester hors procédure (je rejoinds mes sources pour montrer les 'petits changements '

    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
     
     
    BEGIN
     
    	-- Construction de la chaîne de requête
    	DECLARE @sql NVARCHAR(256)
     
    	DECLARE @_langueSource VARCHAR(7)
    	DECLARE @_langueCible VARCHAR(7)
    	DECLARE @_motSource VARCHAR(64)
     
    	SET @_langueSource = 'lang_fr'
    	SET @_langueCible = 'lang_en'
    	SET @_motSource = 'Raison sociale :'
     
     
     
     
    	SET @sql = 'SELECT @langueCibleOUT = ' + @_langueCible +
    				' FROM SELLA.t0 WHERE ' + @_langueSource + ' = @motSourceIN'
     
    	-- Déclaration des paramètres
    	DECLARE @params NVARCHAR(64)
     
    	SET @params = '@motSourceIN NVARCHAR(64), @langueCibleOUT NVARCHAR(7)'
     
    	EXEC SELLR.SELLA.sp_executeSQL
    					@sql,
    					@params,
    					@motSourceIN = @_motSource,
    					@langueCibleOUT = @_langueCible OUTPUT
     
    	SELECT @_langueSource, @_motSource, @_langueCible
    END
    En tout cas merci pour ce code sans curseur, j'ai encore un peu de mal à l'apréhender dans sa totalité mais j'aime beaucoup la démarche de conception mise en place (debutant en procedure et le vendredi ca aide pas ^^)

    EDIT : j'ai corrigé mes erreurs d'inattention

    Donc le code fonctionne bien, il me retourne 3 colonnes
    - une colonne (aucun nom de colonne) contenant lang_fr
    - une colonne avec Raison sociale :
    - une colonne (aucun nom de colonne) contenant lang_en

  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 : 43
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    J'ai oublié les '+' de concaténation de chaînes dans la construction de la requête dans @sql:

    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
    CREATE PROCEDURE PsGetTraduction
    	@_langueSource VARCHAR(7),
    	@_langueCible VARCHAR(7),
    	@_motSource VARCHAR(64)
    AS
    BEGIN
    	IF @_langueSource = @_langueCible
    	BEGIN
    		RAISERROR('La langue source et la langue cible ne peuvent pas être identiques', 16, 1)
    	END
     
    	-- Construction de la chaîne de requête
    	DECLARE @sql NVARCHAR(256)
     
    	SET @sql = 'SELECT @langueCibleOUT = ' + @_langueCible +
    				' FROM dbo.maTable' +
    				' WHERE ' + @_langueSource + ' = @motSourceIN'
     
    	-- Déclaration des paramètres
    	DECLARE @params NVARCHAR(64)
     
    	SET @params = '@motSourceIN NVARCHAR(64), @langueCibleOUT NVARCHAR(7)'
     
    	EXEC maBD.dbo.sp_executeSQL
    					@sql,
    					@params,
    					@motSourceIN = @_motSource,
    					@langueCibleOUT = @_langueCible OUTPUT
     
    	SELECT @_langueSource, @_motSource, @_langueCible
    END
    Vous pouvez ensuite exécuter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXEC dbo.PsGetTraduction 'lang_fr', 'lang_en', 'Raison sociale :'
    Voyez ensuite comment appeler, dans votre application, cette procédure en lui passant des valeurs pour les paramètres

    @++

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 72
    Points : 77
    Points
    77
    Par défaut
    je reprend la suite de mon edit

    Donc le code fonctionne bien, il me retourne 3 colonnes
    - une colonne (aucun nom de colonne) contenant lang_fr
    - une colonne avec Raison sociale :
    - une colonne (aucun nom de colonne) contenant lang_en

    J'essaye de trouver comment faire pour bien recuperer les valeurs et non les critères

    Encore merci de votre aide

  7. #7
    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 : 43
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Je viens de faire le test suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE TbTraductions
    (
    	lang_fr VARCHAR(50),
    	lang_en VARCHAR(50)
    )
     
    INSERT INTO dbo.TbTraductions VALUES ('Raison sociale', 'Corporate name')
    Ensuite j'ai modifié la procédure stockée que je vous ai proposé pour prendre en compte dbo.TbTraductions, et donner un nom aux colonnes du résultat :

    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
    CREATE PROCEDURE PsGetTraduction
    	@_langueSource VARCHAR(7),
    	@_langueCible VARCHAR(7),
    	@_motSource VARCHAR(64)
    AS
    BEGIN
    	SET NOCOUNT ON
     
    	IF @_langueSource = @_langueCible
    	BEGIN
    		RAISERROR('La langue source et la langue cible ne peuvent pas être identiques', 16, 1)
    	END
     
    	-- Construction de la chaîne de requête
    	DECLARE @sql NVARCHAR(256)
     
    	SET @sql = 'SELECT @langueCibleOUT = ' + @_langueCible +
    				' FROM dbo.TbTraductions' +
    				' WHERE ' + @_langueSource + ' = @motSourceIN'
     
    	-- Déclaration des paramètres
    	DECLARE @params NVARCHAR(64),
    			@_motCible VARCHAR(64)
     
    	SET @params = '@motSourceIN VARCHAR(64), @langueCibleOUT VARCHAR(50) OUTPUT'
     
    	EXEC dbo.sp_executeSQL
    					@sql,
    					@params,
    					@motSourceIN = @_motSource,
    					@langueCibleOUT = @_motCible OUTPUT
     
    	SELECT @_langueSource AS langueSource,
    			@_langueCible AS langueCible,
    			@_motSource AS motATraduire,
    			@_motCible AS motTraduit
    END
    J'exécute :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXEC dbo.PsGetTraduction 'lang_fr', 'lang_en', 'Raison sociale'
    Et j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    langueSource	langueCible	motATraduire	motTraduit
    lang_fr	lang_en	Raison sociale	Corporate name
    Ensuite si vous voulez uniquement la traduction, il vous suffit de modifier le dernier SELECT de la procédure en écrivant seulement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT @_motCible AS motTraduit
    @++

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 72
    Points : 77
    Points
    77
    Par défaut
    Merci beaucoup de votre aide

    Ca fonctionne nikel !


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

Discussions similaires

  1. Faire une recherche avec/sans accents
    Par Wedge3D dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 21/02/2007, 10h43
  2. faire une recherche sur des "
    Par richard038 dans le forum Requêtes
    Réponses: 6
    Dernier message: 24/07/2006, 22h30
  3. Créer une liste avec des noms de fichiers
    Par Jeffboj dans le forum Access
    Réponses: 5
    Dernier message: 12/05/2006, 05h48
  4. Faire une boucle avec des variables vides ?
    Par byloute dans le forum Linux
    Réponses: 5
    Dernier message: 23/02/2006, 09h33
  5. [JTable] Créer une JTable vide avec des noms de colonnes.
    Par Cyborg289 dans le forum Composants
    Réponses: 2
    Dernier message: 27/09/2005, 15h54

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