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 :

verifier si un fichier existe en SQL


Sujet :

MS SQL Server

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2004
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 112
    Points : 94
    Points
    94
    Par défaut verifier si un fichier existe en SQL
    Salut tout le monde!

    existe t il une fonction en SQL qui permet de dire si un fichier (ou dossier) existe... genre Dir() en VBA!

    J'ai dans une table une colonne [PATH] qui contient le chemin de quelques images et j'ai envie de savoir quelles images ont été deplacées/supprimées

    donc un truc genre: select PATH from matable where dir(PATH)=0 ???

    Merci!

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 249
    Points : 1 745
    Points
    1 745
    Par défaut acces au disque dur.
    d'une maniere general, pour acceder au disque dur, vous devez utiliser xp_cmdshell, cette commande, desactive par defaut, sur sql serveur 2005, est un trou de securite. a vous de voir!

  3. #3
    Membre régulier
    Inscrit en
    Décembre 2002
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 113
    Points : 84
    Points
    84
    Par défaut
    salut salut,

    je suis un debutant sous ms sql server 2000 et en lisant un de mes bouquins sous sql server je suis tombe sur cet exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DECLARE @fileexists INT
    EXECUTE xp_fileexist 'c:\windows\explorer.exe', @fileexists OUTPUT
    SELECT @fileexists
    bonne fin de semaine
    Christophe
    La forme même des pyramides d'Egypte montre que déjà les hommes avaient tendance à en faire de moins en moins.

  4. #4
    Membre actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 193
    Points : 213
    Points
    213
    Par défaut
    en sql server 2005 il vous est tout a fait possible de faire une procédure stockée écrite en C# ou en VB.Net et qui sera intégrée a votre base de donnée.

    mais le plus propre que je ferai de mon coté est un service windows qui a interval de X (une fois par jour par exemple) va aller vérifier l'ensemble des images a l'endroit spécifier dans la db et mettra a jour un booléen dans la db indiquant fichier manquant si c'est le cas
    Fabian M. - DBA Sql server 2008R2.
    Apprenti Admin Système 2008 R2
    Développeur SSRS, SQL
    Développement C# en hobby

  5. #5
    Membre émérite
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 758
    Points : 2 995
    Points
    2 995
    Par défaut
    Connais-tu les SSIS ? Avec une tâche de type Script, tu peux vérifier l'existence d'un fichier et ensuite continuer ton traitement selon l'existence ou non du fichier.
    Christophe (cavo789)
    Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be

  6. #6
    Membre régulier
    Inscrit en
    Décembre 2004
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 112
    Points : 94
    Points
    94
    Par défaut
    Salut et merci à tous pour vos réponse!


    Connais-tu les SSIS ? Avec une tâche de type Script, tu peux vérifier l'existence d'un fichier et ensuite continuer ton traitement selon l'existence ou non du fichier.
    Je travaille sur MS SQL 2000 donc j'utilise DTS plutot que SSIS, et pour etre honete, les taches script j'en ai jamais utilisé... je vais me renseigner sur le fonctionnement de ce type de tache. ca pourrait m'etre utile!

    mais le plus propre que je ferai de mon coté est un service windows qui a interval de X (une fois par jour par exemple) va aller vérifier l'ensemble des images a l'endroit spécifier dans la db et mettra a jour un booléen dans la db indiquant fichier manquant si c'est le cas

    Comment programmer ce genre de service windows, quel language de programmation? desolé je n'ai aucune idée de comment je peux m'y prendre pour cette solution!

    DECLARE @fileexists INT
    EXECUTE xp_fileexist 'c:\windows\explorer.exe', @fileexists OUTPUT
    SELECT @fileexists

    ca me parait la solution la plus facile et rapide à implementer, je teste et vous tiens au courant ...


    Merci encore pour votre aide!

  7. #7
    Membre régulier
    Inscrit en
    Décembre 2004
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 112
    Points : 94
    Points
    94
    Par défaut
    salut,

    j'ai chercher un peu des infos sur cette procedure xp_fileexist, il parait que c'est une procedure non documenté par microsoft... et bizarement elle fonctionne que pour les fichiers se trouvant sur "c:\" (ou du moins sur un support local)

    on executant ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXECUTE master.dbo.xp_fileexist 'c:\autoexec.bat'
    on obtient
    File Exists | File is a Directory | Parent Directory Exists
    1 | 0 | 1
    mais j'essaye avec un fichier sur un serveur/poste distant (\\server\dossier\image.jpg), ca me retourne 0 partout, alors que le fichier existe bien!

    quelqu'un a t il une idée, pourquoi ca fonctionne pas?!

    Merci

  8. #8
    Membre émérite
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 758
    Points : 2 995
    Points
    2 995
    Par défaut
    Citation Envoyé par monsurf Voir le message
    bizarement elle fonctionne que pour les fichiers se trouvant sur "c:\" (ou du moins sur un support local)
    Peut-être vais-je écrire une bétise mais il me semble que cela ne fonctionne que sur la machine où SQL Server est installé. Si ta DB est locale, tu peux donc vérifier un fichier sur ton disque dur.

    Une fois que ta DB sera en production (sur un serveur dédicacé), le C: sera celui du serveur et plus le tien.


    Voici le script SSIS que j'utilise pour vérifier l'existence d'un fichier :

    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
     
    Public Class ScriptMain
     
        Public Sub Main()
     
            ' Set bImport to False is the file doesn't exists
     
            If System.IO.File.Exists("C:\MonFichier.TXT") Then
                Dts.Variables.Item("bImport").Value = 1
            Else
                Dts.Variables.Item("bImport").Value = 0
                Dts.Events.FireInformation(0, "", "C:\MonFichier.TXT doesn't exists", "", 0, True)
            End If
     
            Dts.TaskResult = Dts.Results.Success
     
        End Sub
     
    End Class
    Ce code va assigner la valeur 1 ou 0 à une variable SSIS et, ensuite, je peux récupérer cette variable comme valeur conditionnelle au niveau de l'enchainement de mes tâches. Ainsi, je continuerais mon processus lorsque le contrôle ci-dessous sera valable :

    Christophe (cavo789)
    Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be

  9. #9
    Membre régulier
    Inscrit en
    Décembre 2004
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 112
    Points : 94
    Points
    94
    Par défaut
    Merci cavo789 pour ton script, je vais essayer d'implementer ca dans un package DTS!

    pour ce qui est des fichiers, lesquels je doit verifier la validité ils se trouvent malheureusement pas dans le meme serveur que la BDD, mais dans un fileserver dedié pour le stockage de fichiers uniquement... ce fileserver se trouve dans le meme domaine que le serveur SQL et est accessible par ce dernier!

    donc si qq1 peut confirmer que xp_fileexist ne fonctionne que pour les fichiers locaux, ca sera sympa... comme ca je laisse tomber cette piste


    Merci!

  10. #10
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 249
    Points : 1 745
    Points
    1 745
    Par défaut question.
    j'ai travaillé autrefois avec les DTS et il permettent en effet d'effectuer des traitements sur un import. Par contre, là, où je ne comprend pas, c'est comment tu veux fournir l'information obtenu dans ton dts à une requete sql se trouvant dans une procedure stockée par exemple ?

    Merci de m'éclaircir.

    PS : la solution du service exterieur me parrait la meilleure solution, un sgbd n'a pas à gérer le disque dur...

    PS2 : tu peux utiliser un chemin UNC dans xp_fileexist

  11. #11
    Membre régulier
    Inscrit en
    Décembre 2004
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 112
    Points : 94
    Points
    94
    Par défaut
    Citation Envoyé par ylarvor Voir le message
    Par contre, là, où je ne comprend pas, c'est comment tu veux fournir l'information obtenu dans ton dts à une requete sql se trouvant dans une procedure stockée par exemple ?

    Merci de m'éclaircir.
    en fait tout ce que je veux c'est de trouver parmi les chemins de fichiers ceux qui ne sont pas/plus valide... ces chemins se trouve dans une colonne nommé PATH dans matable.

    donc, avec un bout de code TSQL je ferai une boucle qui parcours tout les chemins de fichiers, et quand xp_fileexist = 0 , je mets à jour une colonne VALIDE=FALSE.
    voila tout...

    pour les DTS, je ne suis pas encore certain, mais il parait qu'on peux utiliser des variables à faire passer entre les taches, et comme tu as aussi la tache 'executer SQL' tu peux utiliser la variable que tu recupere dans une autre tache (du meme dts package) dans ta requete SQL


    Citation Envoyé par ylarvor Voir le message
    PS : la solution du service exterieur me parrait la meilleure solution, un sgbd n'a pas à gérer le disque dur...
    je ne sais pas comment faire ceci avec un service exterieur... celui ci dois pouvoir se connecter à la BDD pour chercher les chemins à verifier...
    Citation Envoyé par ylarvor Voir le message
    PS2 : tu peux utiliser un chemin UNC dans xp_fileexist
    deja essayé mais ca me retourne toujours 0 alors que le chemin existe

    Merci

  12. #12
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 249
    Points : 1 745
    Points
    1 745
    Par défaut La question est : Pourquoi executer cette requete sous sql serveur ?
    Salut,

    A quel moment comptes-tu executer xpfileexist ? Pourquoi, ce n'est pas le programme client qui gère cette problèmatique ?

    Exemple : Je veux accéder à la table chemin, je charge les chemins dans un dataset, je supprime les lignes qui ne sont plus à jour ( chemin perime ), j'utilise la table chemin dans mon programme client, quand j'ai fini, je sauvegarde la nouvelle table chemin ( sans les chemins perime ).

  13. #13
    Membre émérite
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 758
    Points : 2 995
    Points
    2 995
    Par défaut
    En ce qui me concerne je peux répondre : chaque jour je dois importer près de 150 fichiers. Ces fichiers se trouvent sur un serveur FTP et donc, chaque matin, je fais un FTP Get puis je fais l'importation.

    Ensuite, chaque mois, j'ai des fichiers supplémentaires. Ces fichiers, une fois importés, sont archivés dans un folder d'archivage.

    ==> mon script d'importation importe mes 150 fichiers journaliers puis, j'ai un second package qui est chargé de vérifier la présence d'un fichier mensuel. S'il le trouve, il l'importe. Sinon, fin de traitement.

    Mon second script tourne tous les jours car il se pourrait, fait rarissime, qu'un fichier mensuel est généré avant la fin du mois pour p.e. faire des tests.
    Christophe (cavo789)
    Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be

  14. #14
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 249
    Points : 1 745
    Points
    1 745
    Par défaut importation & procedure stockee.
    En ce qui me concerne je peux répondre : chaque jour je dois importer près de 150 fichiers. Ces fichiers se trouvent sur un serveur FTP et donc, chaque matin, je fais un FTP Get puis je fais l'importation.
    Je suis d'accord sur ton besoin. mais il me semble que SSIS est peripherique à sql serveur. tu appelles tes lots depuis l'agent sql serveur de maniere cyclique et ca marche tres bien comme ca.

    là, où je ne serais pas d'accord, ce serait d'appeler un lot depuis une procedure stockee ou une requete à l'interieur du serveur. d'ailleurs, il semble qu'il faut xp_cmdshell pour le faire.

    reference : http://www.simple-talk.com/sql/sql-s...sis-packages-/

  15. #15
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 800
    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 800
    Points : 52 833
    Points
    52 833
    Billets dans le blog
    5
    Par défaut
    xp_fileexists n'est pas documentée et il n'est pas conseillé de l'utiliser pour des raisons de sécurité et de portabilité.
    Néanmoins à l'aide de la fonction xp_cmdshell vous pouvez vous amuser à tester l'existence d'une fichier par sa recréation.

    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/ * * * * *

Discussions similaires

  1. Verifier qu'un fichier existe ?
    Par mello dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 25/02/2008, 10h20
  2. verifier si un fichier existe avec Inet
    Par bailamos dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 12/10/2007, 09h08
  3. [VC++] comment verifier qu'un fichier existe deja
    Par ksoft dans le forum Visual C++
    Réponses: 17
    Dernier message: 21/09/2006, 14h56
  4. verifier si un fichier existe
    Par franfr57 dans le forum ASP
    Réponses: 7
    Dernier message: 12/02/2006, 10h08
  5. Réponses: 2
    Dernier message: 05/09/2005, 16h32

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