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 :

CTE ou plutot un champ concaténé pour regrouper mes clés string


Sujet :

Développement SQL Server

  1. #1
    Membre expérimenté Avatar de Arthis
    Profil pro
    Inscrit en
    octobre 2003
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Italie

    Informations forums :
    Inscription : octobre 2003
    Messages : 1 265
    Points : 1 352
    Points
    1 352
    Par défaut CTE ou plutot un champ concaténé pour regrouper mes clés string
    Bonjour,

    j aurais une petite question concernant la meilleurs facon de faire .

    voila, je suis en train de faire un systeme de localisation pour du contenu. Pour ce faire, j'utilise une clé qui peut ressembler à cela "Button.Click.Save". Button et click sont alors des groupes et Save est ce que j'appelle une clé. à cette clé sont associé differents texte dans une langue chacun.

    Et je me pose des questions sur la meilleure facon d'accéder, stocker mes données. J'ai 3 tables comme cela (Si l'image ne fonctionne aps , n'hesitez pas à reloader la page):




    Pour l'instant, j ai commencé à traiter dans une procédure stockée la clé que je pourrais recevoir :


    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    declare @key VARCHAR(64) 
    declare @Separator nvarchar(1)
    declare @LocalisationKeyId int
    declare @DateOfAction datetime
    declare @LanguageName  nvarchar(2)
     
    set @key = 'Button.Click.Save';
    set @Separator = '.';
    set @DateOfAction = getdate();
    set @LanguageName = 'de';
     
     
    DROP TABLE #T_LocalisationTemp ;
    DROP TABLE #T_KeyTemp ;
     
    --Put in a temporary table the name  found in this key
    WITH CTE (Deb, Fin,level) AS 
    	( 
    	  SELECT 1 Deb, CHARINDEX( @Separator, @key +  @Separator) Fin ,0
    	 UNION ALL 
    	  SELECT Fin + 1, CHARINDEX( @Separator, @key + @Separator, Fin + 1) ,level+1
    	  FROM CTE 
    	  WHERE CHARINDEX(  @Separator, @key +  @Separator, Fin + 1 ) > 0 
    	) 
    	SELECT SUBSTRING(@key, Deb , Fin - Deb) as GroupKeyName,level
    	into #T_KeyTemp
    	FROM CTE ;
     
    Select top 1 * from #T_KeyTemp
    		order  by level Desc;
     
    --Put in a temporary table the groupid that may fit the name of the localisation goup found in this key
    Select LocalisationGroupId,LocalisationGroupParentGroupId 
    	INTO #T_LocalisationTemp
    	from T_LocalisationGroup_LGR L
    	where L.LocalisationGroupName in
    	(
    	 select GroupKeyName from #T_KeyTemp
    	);
     
    --Apply recursivity to determines the possible son of the first name found in the key
    WITH tree (groupid, parentgroupid,level) AS 
    	( 
    	Select  LocalisationGroupId,LocalisationGroupParentGroupId,0 from T_LocalisationGroup_LGR 
    		where LocalisationGroupName= substring(@key,0,patindex( '%'+@Separator+'%',@key))
    	Union ALL
    	Select LocalisationGroupId,LocalisationGroupParentGroupId,level+1 FROM #T_LocalisationTemp L
    	INNER JOIN tree t
    		ON t.groupid = L.LocalisationGroupParentGroupId
     
     
    	)
    	-- select the key that I am looking for
    	Select @LocalisationKeyId=LocalisationKeyId from T_LocalisationKey_LKE
    	where LocalisationKeyParentGroupId=
    		(-- select the final GroupId
    		Select top 1 groupid from tree 
    		order by level desc)
    	and  LocalisationKeyName in 
    		(
    		Select top 1 GroupKeyName from #T_KeyTemp
    		order  by level Desc
    		)
     
    Select * from V_LocalisationItem
    where  LocalisationItemKeyId= @LocalisationKeyId
    and LocalisationItemLanguage=@LanguageName
    and LocalisationItemStartDate<=isnull(@DateOfAction,LocalisationItemStartDate)
    and LocalisationItemEndDate>=isnull(@DateOfAction,LocalisationItemStartDate)

    Mais je me demande si cela ne fais pas beaucoup tourner mes données pour pas grand chose , ne devrais je pas créer un champ dans ma table T_LocalisationKey_LKE pour concatener les noms des groupes afin de pouvoir y acceder directement?

    Merci de votre avis,

  2. #2
    Membre expérimenté Avatar de Arthis
    Profil pro
    Inscrit en
    octobre 2003
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Italie

    Informations forums :
    Inscription : octobre 2003
    Messages : 1 265
    Points : 1 352
    Points
    1 352
    Par défaut
    Je me permets de remonter la question...

    merci d'avance de votre lecture..

  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 : 40
    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 348
    Points
    12 348
    Par défaut
    Bonjour,

    ne devrais je pas créer un champ dans ma table T_LocalisationKey_LKE pour concatener les noms des groupes afin de pouvoir y acceder directement?
    Si vous connaissez les groupes, alors je pense que oui, vous avez tout intérêt à créer une table qui contienne toutes les combinaisons de vos groupes concaténés, en leur adjoignant une colonne qui vous servira de clé primaire et en la référençant dans la table T_LocalisationKey_LKE

    En indexant correctement la colonne de clé étrangère, vous obtiendriez je pense de meilleures performances qu'avec la CTE.

    @++

  4. #4
    Membre expérimenté Avatar de Arthis
    Profil pro
    Inscrit en
    octobre 2003
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Italie

    Informations forums :
    Inscription : octobre 2003
    Messages : 1 265
    Points : 1 352
    Points
    1 352
    Par défaut
    Merci de ta réponse. J ai suivi ton conseil et créer un index sur ma colonne.

    Ca m'a demandé un peu de travail pour que la géneratino de cette colonne soit automatique, mais je pense que cela en valait le coup!

    Merci encore et à bientôt,

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

Discussions similaires

  1. Concaténation d'un champ supplémentaire pour chaque ligne d'un fichier
    Par saladin443 dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 27/05/2013, 13h49
  2. Concaténation pour remplissage de champ
    Par codebourrin dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 04/01/2013, 19h02
  3. [XSLT 1.0] Regrouper des champs multiples pour qu'ils soient uniques
    Par a-dawg dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 02/03/2011, 09h08
  4. Concaténation avec regroupement sur un champs
    Par isabelle b dans le forum VBA Access
    Réponses: 12
    Dernier message: 23/05/2008, 08h27
  5. Réponses: 20
    Dernier message: 08/10/2007, 16h01

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