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 :

Chaine de caractere


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Octobre 2002
    Messages : 80
    Par défaut Chaine de caractere
    Bonjour,

    nous avons des procedures stockées en CLr et expression régulière pour nettoyer des champs en caracteres accentués et en caracteres parasite.

    toutefois c'est des grosses volumétrie plusieurs millions de ligne et c'est tres long.

    en perl cela va bien mais alors bien plus vite.
    mais cela ne nous facillite pas la vie en terme de manipulation.
    existe t'il quelques chose à ce sujet ?


    qui pourrait etre bien optimisé ? ou perl reste le meilleur.


    Merci par avance

  2. #2
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Bonjour,

    Un exemple de chaîne à nettoyer ?
    Le code de la procédure CLR ?
    Comment exécutez vous cette procédure ?

    Merci

    ++

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 240
    Par défaut
    Tu devrais trouver ton bonheur dans les papiers de SQLPro, en SQL

    http://sqlpro.developpez.com/cours/sqlserver/udf/

    Cherche le mot clé "purge".

  4. #4
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Octobre 2002
    Messages : 80
    Par défaut
    exemple de chaine à nettoyer...

    Thomas ; Névallön-TUTU

    doit donner

    THOMAS; NEVALLON-TUTU

    en gros c'est les majuscules (sans accent)
    car le upper les garde sauf si vous avez une astuce

    et engros on garde de la chaine les lettres
    a-z
    A-Z
    1-9
    et le caractere -
    les apostrophes sont remplacé par espace, mais tous les espaces doivent se cumuler à 1 maximum.


    chaque champ à traiter est envoyé à une fonction CLR.


    via un update du style
    update TOTO
    set A = dbo.clean(A),
    B = dbo.clean(B)

  5. #5
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Bonjour,

    Il faudrait voir le code de votre fonction CLR mais celle-ci pourrait convenir je pense. A tester en terme de performance !!!

    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
    using System;
    using System.Text.RegularExpressions;
    using System.Data;
    using System.Data.SqlClient;
    using System.Data.SqlTypes;
    using Microsoft.SqlServer.Server;
     
    public partial class RegExpReplaceString
    {
        [Microsoft.SqlServer.Server.SqlFunction]
        public static string RegExpReplaceStringCLR(string StringToClean)
        {
            byte[] aOctets = System.Text.Encoding.GetEncoding(1251).GetBytes(StringToClean);
            string replaceSpecialCaracters = System.Text.Encoding.ASCII.GetString(aOctets);
            return Regex.Replace(replaceSpecialCaracters, @"\s+|\""", " ").ToUpper();
        }
    };
    ++

  6. #6
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Octobre 2002
    Messages : 80
    Par défaut
    Merci fred j'ai une erreur en Vb.net de ta function je voulais tester la vitesse.

    j'etais arrivé à une fonction proche de la tienne ...
    et je voulais voir la variante mais elle gauffre je l'ai surement mal traduite en VB.net

    voici le code de ta fonction traduite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Partial Public Class RegExpReplaceString
        <Microsoft.SqlServer.Server.SqlFunction()> _
        Public Shared Function RegExpReplaceStringCLR(ByVal StringToClean As String) As SqlString
     
     
            Dim aOctets As Byte() = System.Text.Encoding.GetEncoding(1251).GetBytes(StringToClean)
            Dim replaceSpecialCaracters As String = System.Text.Encoding.ASCII.GetString(aOctets)
            Return Regex.Replace(replaceSpecialCaracters, "\s+|\""", " ").ToUpper()
     
                End Function
     
    End Class

    et voici celle que j'utilise qui malheureusement n'est pas aussi rapide que d'utiliser le perl en extrene plus de beaucoup mais bon !
    sachant que le remplacement des caracteres spéciaux est remplacé par un espace et que 2 espaces d'affilé doivent etre remplacé par un seul voir meme tout les espaces qui se suivent doivent finir en 1 espace.
    j'applique meme pas cette regex et j'suis quand meme plus lent...snif



    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
    Partial Public Class UserDefinedFunctions
        <Microsoft.SqlServer.Server.SqlFunction()> _
        Public Shared Function fn_test(ByVal STR As SqlString) As SqlString
     
            Dim aOctets As Byte() = System.Text.Encoding.GetEncoding(1251).GetBytes(STR.ToString)
            Dim txt As String = System.Text.Encoding.ASCII.GetString(aOctets).ToUpper
     
            Dim Carac As String = "[^ A-Z0-9-]"
            Dim instance As New Regex(Carac)
     
            If instance.IsMatch(txt) Then
                txt = instance.Replace(txt, " ")
            End If
            Return txt
     
     
        End Function
    End Class

  7. #7
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Merci fred j'ai une erreur en Vb.net de ta function je voulais tester la vitesse.
    Moi c'est David ou Mikedavem

    j'etais arrivé à une fonction proche de la tienne ...
    et je voulais voir la variante mais elle gauffre je l'ai surement mal traduite en VB.net

    Faudrait que j'essaye en vb.net. J'avoue être bcp plus à l'aise en CSsharp
    Mais personnellement je ne pense pas que vous soyez plus rapide avec une fonction .NET.

    Il faudrait peut être passer par les objets OLE directement mais je ne pense pas que cela change beaucoup.

    ++

Discussions similaires

  1. Réponses: 9
    Dernier message: 06/11/2007, 12h36
  2. Réponses: 13
    Dernier message: 13/06/2003, 14h13
  3. Pb Update avec chaine de caractere
    Par JuJu° dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 28/05/2003, 15h58
  4. [LG]comparaison de chaines de caracteres
    Par thesam dans le forum Langage
    Réponses: 6
    Dernier message: 20/05/2003, 22h41
  5. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01

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