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 :

Procédure stockée - extraire nom de fichier et extension


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 24
    Points : 12
    Points
    12
    Par défaut Procédure stockée - extraire nom de fichier et extension
    Bonjour ou bonsoir,

    J'aimerai par le biais d'une procédure stockée lire un champ d'une table qui contient des nom de fichiers suivis de leur extension (par exemple 'toto.doc' du champ 'nomfichier'), et ensuite séparer le nom de fichier de son extension pour utiliser l'extension et la comparer avec une autre située dans une table différente (je veux comparer le 'doc' de 'toto.doc' avec un 'doc' situé dans une autre table).

    Je n'ai jamais fais de procédure stockée,

    Merci de votre aide.

  2. #2
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut
    Bonsoir,

    Il doit une avoir un moyen simple en .net avec Path.GetExtension()
    mais si vous n'avez jamais écrit de procédure stockée ça n'est peut être pas la première des choses à tenter.
    En TSQL, vous pouvez utiliser CHARINDEX() pour obtenir la position d'une chaîne de caractères dans une autre et REVERSE() si vous voulez inverser une chaîne de caractères (vous devrez chercher la position du dernier point).

    Voici une liste de fonctions de TSQL
    http://sqlpro.developpez.com/cours/sqlaz/fonctions/

    Il serait peut être plus intéressant d'écrire une fonction utilisateur (CREATE FUNCTION) qui vous
    permettrait d'écrire un code de ce genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM tbFichier 
    INNER JOIN tbExt ON fnExt(cheminfichier) = tbExt.extension
    @+

  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 : 42
    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,

    Je vous propose deux solutions, je ne sais ni laquelle convient le mieux, ni laquelle est la plus performante, ni laquelle est la plus élégante.

    La première, c'est de créer la fonction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE FUNCTION Fn_Extrait_Extension_Fichier
    	(
    		@nomFichierAvecExtension VARCHAR(255)
    	)
    RETURNS VARCHAR(4)
    WITH SCHEMABINDING
    AS
    BEGIN
    	RETURN
    	(
    		RIGHT(@nomFichierAvecExtension, CHARINDEX('.', REVERSE(@nomFichierAvecExtension)) - 1)
    	)
    END
    GO
    Un exemple d'utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DECLARE @nomFichier VARCHAr(255)
    SET @nomFichier = 'toto.doc'
    SELECT dbo.Fn_Extrait_Extension_Fichier (@nomFichier)
    Et la fonction vous retourne doc.

    Avec cette fonction, vous pouvez ensuite ajouter une colonne calculée à votre table. Dans votre cas vous devrez écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE dbo.Fichier
    ADD COLUMN extensionDuFichier AS dbo.Fn_Extrait_Extension_Fichier(nomFichierAvecExtension)
    Vous pouvez ajouter PERSISTED à la fin de cette commande pour que les valeurs calculées soient stockées avec les autres données de la table
    (Si vous ne le faites pas les extension sont calculées au moment de l'exécution de la requête, mais elles ne sont pas stockées physiquement).
    Cela vous permettra en outre d'indexer cette colonne (pour les performances).

    Ainsi lorsque vous réaliserez une insertion de données dans votre table, l'extension du fichier sera automatiquement extraite.
    Pour vous montrer un exemple d'utilisation, j'ai supposé que nous avons une table donc la spécification est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE Fichier
    (
    	IDFichier INT IDENTITY CONSTRAINT PK_Fichier PRIMARY KEY,
    	nomFichierAvecExtension VARCHAR(255) NOT NULL CONSTRAINT CHK_Fichier_nomFichierAvecExtension CHECK(nomFichierAvecExtension LIKE '%.%'),
    	extensionDuFichier AS dbo.Fn_Extrait_Extension_Fichier(nomFichierAvecExtension) PERSISTED
    )
    GO
    Créons l'index :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE INDEX IX_Fichier_extensionDuFichier
    ON dbo.Fichier(extensionDuFichier)
    Voici un exemple d'insertion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO dbo.Fichier (nomFichierAvecExtension) VALUES ('toto.doc')
    Et si nous exécutons SELECT * FROM dbo.Fichier, nous obtenons :

    IDFichier nomFichierAvecExtension extensionDuFichier
    --------------------------------------------------------
    1 toto.doc doc
    Dès lors il est simple de comparer les extensions extraites à celles que vous avez dans l'autre table.

    Voyons la seconde solution : il s'agit de créer une vue, éventuellement indexée (toujours pour les performances).
    Une vue qui n'est pas indexée est en fait une table qui n'a pas d'existence physique, c'est à dire que les valeurs de la requête qui la spécifie ne pas sont stockées.
    Une vue indexée vous permet de créer le même niveau d'abstraction mais en persistant les données.
    Dans les deux cas, les vues se requêtent comme une table.

    Voici donc la spécification de la vue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE VIEW V_Fichier_Extension
    	WITH SCHEMABINDING
    AS
    SELECT IDFichier, RIGHT(nomFichierAvecExtension, CHARINDEX('.', REVERSE(nomFichierAvecExtension)) - 1) AS Extension
    FROM dbo.Fichier
    GO
    Indexons maintenant cette vue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE UNIQUE CLUSTERED INDEX IX_V_Fichier_Extension_IDFichier
    ON dbo.V_Fichier_Extension (IDFichier)
    Le fait de créer un index cluster sur cette vue persiste le données.
    Il est néanmoins nécessaire que la colonne que vous indexez (IDFichier) contienne des valeurs strictement uniques.

    De la même façon que pour la table avec une colonne calculée, il est simple de comparer les extensions déterminées de cette façon à celles que vous avez dans l'autre table.

    @++

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Merci beaucoup pour ces différents exemples ^^ je vais voir de mon coté ce que je peux en tirer !

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Ce que vous m'avez donné est très bien, j'aimerai savoir s'il est possible d'avoir la même chose en procédure stockée ? Je ne vois pas la différence avec les fonctions c'est pour ça...

  6. #6
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut
    Bonsoir,

    C'est vrai que la différence n'est pas claire de prime abord

    Pour la colonne calculée, il n'est pas possible d'utiliser une procédure stockée.
    Une fonction renvoie:
    • une valeur (fonction scalaire)
    • ou bien une table (fonctions de table).

    Ici, l'intérêt particulier d'une fonction est quelle peut être appelée pour fournir une colonne dans une requête ou bien une colonne calculée.

    Une fonction ne peut pas modifier de données, sauf une variable table locale, car elle ne doit pas avoir d'effet de bord, sinon ce serait quand même gênant dans les requêtes :-)

    Une procédure stockée peut renvoyer un jeu de résultat, des variables en sortie via l'utilisation de OUTPUT et une expression entière de statut via RETURN, mais ne peut pas être utilisée pour obtenir les valeurs d'une colonne calculée.

    Une procédure est appelée explicitement, une fonction scalaire peut être appelée explicitement, ou implicitement pour chaque ligne d'un jeu de données.

    Une procédure est utilisée pour effectuer des traitement car elle peut modifier des données.

    @+

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Ok ! Merci du renseignement

  8. #8
    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 : 42
    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,

    Les différences entre une fonction et une procédure stockées sont ici

    @++

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

Discussions similaires

  1. Récupérer un nom de fichier sans extension
    Par OxN dans le forum Général Java
    Réponses: 13
    Dernier message: 01/08/2011, 17h13
  2. Procédure stockée et nom de table dynamique
    Par chatlumo dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 15/02/2009, 15h29
  3. recuperer, extraire nom de fichier
    Par froggyaz dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 20/01/2009, 17h35
  4. Extraire nom de fichier du chemin
    Par kalou26 dans le forum C++Builder
    Réponses: 5
    Dernier message: 22/06/2006, 15h23
  5. Réponses: 3
    Dernier message: 30/01/2006, 17h24

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