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 :

Découpage d'une adresse en n°, type, nom due rue [2008]


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 251
    Par défaut Découpage d'une adresse en n°, type, nom due rue
    Salut à tous,
    Dans le cadre d'un import de données type fichiers texte via un bulk insert, j'ai besoin de faire un traitement post-import sur des adresses.

    J'ai une table Parametre :
    - ID (int)
    - Type (char) : beaucoup de choses dont 'Voie'
    - Valeur (char) : par exemple pour le type 'Voie' : Rue, Avenue, Boulevard, ou encore Hameau

    J'ai une table Adresse :
    - ID (int)
    - Numero (char)
    - IdTypeVoie (int)
    - Adresse1 (char)
    - Adresse2 (char)
    - Adresse3 (char)

    Mon import de données rempli les champs Adresse2 et Adresse3, parfois Adresse1, Adresse2, Adresse3
    Dans un de ces champs (pas défini et potentiellement variable d'une ligne à l'autre), on est censé trouver une donnée par '110 Avenue des Champs-Elysées'

    Dans mon post import, je dois regarder chaque ligne de la table Adresse et voir si je peux découper un des 3 champs Adressex en N° de voie, type de voie, nom de voie.
    Sur le principe, on regarde dans la valeur du champ si on trouve une des valeurs de type 'Voie' de la table paramètre.
    Si oui, on prend ce qui est à gauche pour le mettre dans Numero, on prend l'id correspondant de la table Parametre et on le met dans IdTypeVoie, on prend le reste et on le met dans Adresse1, puis on vide le champs (sauf si au départ c'est déjà Adresse1 ).
    On regarde dans l'ordre Adresse1, Adresse2, Adresse3, sachant que si on peut en découper un, on ne regarde pas les autres, on passe à la ligne suivante.

    Je me sens un peu léger pour faire ça en SQL (requete, script, éventuellement Ps s'il le faut), je me dis que c'est possible mais j'ai quand même un doute.
    Je préfèrerais le faire dans le moteur SQL plutôt que dans le logiciel d'import car, prochainement, un des opérateurs va se retrouver à travailler depuis un site distant (le logiciel sera sur son poste, le serveur SQL sur un autre site géographique). Et ce ne sera pas, à priori, le seul dans l'avenir.
    Pour des raisons de performances, je voudrais donc éviter le plus possible d'avoir à récupérer une masse de données, les traiter en local, pour les renvoyer ensuite.

    Une volumétrie de 20000 lignes ne serait pas exceptionnelle, une durée de traitement serait encore acceptable jusqu'à environ 2 min, je pense.

  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
    22 001
    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 : 22 001
    Billets dans le blog
    6
    Par défaut
    C'est faisable sans problème en SQL, mais tu aura toujours des cas particulier à traiter manuellement. La table de ref des voies servant de pivot au découpage par le biais d'une jointure avec LIKE.

    Pense cependant à normaliser ta table des adresses qui devrait être au final de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    T_ADRESSE_ADR (ADR_ID, ADR_CP, ADR_VILLE, PAY_ID, ADR_NUMERO, VOI_ID, ADR_VOIE_LIBELLE)
    T_ADRESSE_LIGNE_ADL (ADL_ID, ADR_ID, ADL_POSITION, ADL_LIBELLE)
    En effet, cela évite des NULL dans la table des adresses lorsque certaines lignes d'adresse ne sont pas renseignées.

    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
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 251
    Par défaut
    pour ce qui est de la table Adresse, la structure n'est pas modifiable, elle est déjà en circulation depuis des années.

    Les cas particuliers sont pas un problème. Le but est de traiter ce que l'on peut traiter. Ce que l'on ne peut pas, on n'y touche pas. Dis autrement, si on sais/peut découper la chaîne, on le fait, sinon on laisse tel quel. Les données ne seront pas perdues, elles seront juste pas présentées de façon optimale.

    Pour ce qui est du code SQL, pour le moment je sais pas trop par quel bout le prendre. Mais si tu dis que c'est possible, ça me rassure.


    NOTA : AU cas ou il y aurait un doute, pour les tables, je n'ai donné que les champs qui intéressant dans ce problème, les tables contiennent évidemment d'autres champs, notamment CP et ville pour la table adresse, mais ils ne sont pas concernés par ce traitement à faire

  4. #4
    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 : 44
    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
    Par défaut
    Bonjour,

    Pour ce qui est du code SQL, pour le moment je sais pas trop par quel bout le prendre
    Vous allez être obligé de spécifier une jointure entre la table d'import et la table Parametre à l'aide d'un LIKE ou d'un PATINDEX dans le prédicat pour connaître les éléments existants dans l'adresse.
    A partir de là il va falloir extraire les sous-chaînes à coup de CHARINDEX et de SUBSTRING ... c'est là que ça va piquer.

    Alternativement, peut-être pouvez-vous utiliser un package SSIS ?

    @++

  5. #5
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 251
    Par défaut
    L'injection de données se fait dans le cadre de la préparation d'une base métier à partir d'un backup servant de template et récupération de data.

    Tout ce que je peux utiliser n'existe pas dans la base initialement et doit donc pouvoir y être créer simplement par le logiciel d'import via requête/script sql, et doit pouvoir, de la même manière, y être supprimer lorsque la base est validée et nettoyée pour la mise en production.

    De mémoire, je pense que je n'ai encore jamais utiliser de package SSIS.

    En requête, je pense que oui, ça va piquer, d'autant plus que ce n'est pas un champs que je dois découper, mais un des 3, sans savoir, pour chacune des lignes, lequel ça sera (ou à la limite, si c'est pas trop crame en terme de perfs, je pourrais faire en 3 passes). Et de plus, pour compliquer la chose, le délimiteur n'est pas fixe mais un parmi une liste non connue à l'avance et il faut que je récupère l'id du délimiteur qui matche, en plus.

    Cerise sur le gâteau (mais ça on verra, peut-être que je dirais que c'est pas jouable), il faudrait que je produise une requête que la hotline pourrait passer sur les bases déjà en prod. Ce point-là, pour le moment, je l'oublie

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 101
    Par défaut
    Un jeu de données serait le bien venu si vous voulez que l'on réponde correctement à votre demande.

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

Discussions similaires

  1. définir une adresse IP avec de nom dans fichier host
    Par travail2009 dans le forum Windows Serveur
    Réponses: 5
    Dernier message: 13/05/2010, 09h32
  2. Réponses: 1
    Dernier message: 10/05/2010, 13h35
  3. Réponses: 41
    Dernier message: 14/02/2010, 00h54
  4. Retrouver une adresse mail de format nom@site.fr
    Par Thierry_94 dans le forum VBA Outlook
    Réponses: 4
    Dernier message: 10/06/2008, 20h42
  5. découpage d'une adresse
    Par AlexFred dans le forum Access
    Réponses: 2
    Dernier message: 07/05/2007, 18h02

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