2009-05-04 7 views
0

Le titre le dit un peu, mais je vais élaborer un peu. J'utilise SQL Server 2005 et j'écris une requête d'exportation qui retournera une liste d'utilisateurs. Certains utilisateurs ont des images de profil, d'autres non. L'image de profil n'est pas représentée dans la base de données, du tout. Il y a juste un fichier sur le système de fichiers, nommé [nom d'utilisateur] .jpg. Donc ce que je dois faire est de vérifier si un tel fichier existe pour l'utilisateur.Comment puis-je obtenir une liste de fichiers à partir du système de fichiers local dans SQL Server 2005?

+0

Y at-il une bonne raison pour vous de le faire dans SQL du tout? J'utiliserais un langage de programmation plus expressif qui comprend à la fois un système de fichiers et une couche d'accès aux bases de données. – Tomalak

+0

L'idée initiale était de le résoudre avec SQL, mais à partir des réponses jusqu'à présent, j'ai l'impression que ce n'est pas une bonne idée. ;) Je pourrais avoir à chercher une autre solution. La raison de le faire en SQL était le facile de l'appeler à partir d'une interface web. Je ferais peut-être mieux de le faire avec SSIS à la place. –

Répondre

1

Eh bien, si vous devez vous pouvez toujours faire le

suivant
DECLARE @fso int, 
     @hr int 
EXECUTE @hr = sp_OACreate 'Scripting.FileSystemObject', @fso OUT 

A partir de ce que vous pouvez (si h = 0) obtenir un bon vieux FileSystemObject.

A partir de ce que vous devriez être en mesure de faire ce qui suit

EXECUTE sp_OAMethod @fso, 'FileExists', @hr OUT, @FileName 

Mais vraiment, de vouloir ce faire, vous allez en enfer **** **** sourire

de Bien sûr, cela dépend de beaucoup de choses, de la configuration de votre serveur SQL, de l'utilisateur sous lequel il fonctionne, etc. Votre kilométrage peut varier.

+0

Aller en enfer, dites-vous. Je sens que cette solution n'est pas ce que l'on pourrait appeler la meilleure pratique. Est-ce que je vous lis bien? :) Devrais-je examiner une autre solution? –

+1

Heh. Bien ActiveX dans SQL a toutes sortes d'implications, pas moins de problèmes de sécurité. Si vous pouviez réécrire le téléchargement de façon à ce qu'il définisse un indicateur dans la base de données ou le nom de fichier qui serait le meilleur, mettez à jour la table en une fois – blowdart

+0

Oui, je vois absolument votre point. Peut-être devoir faire cela, car il se sent comme la solution la plus sensée à la fin. C'est juste un peu plus dans la DB. Soit ça, soit je vais faire une sorte de paquetage SSIS qui le résoudra pour moi. –

0

Y a-t-il un bon raison de ne pas stocker les images dans la base de données? Vous ne voulez pas vraiment accéder au système de fichiers à partir de votre back-end de base de données, car donner un accès à un système de fichiers utilisateur de base de données a d'importantes implications en termes de sécurité. Cela laisse deux options: stocker les images dans la base de données, ou accéder aux fichiers uniquement à partir de votre application cliente.

+0

La "bonne" raison pour ne pas stocker les images dans la base de données est que les bases de données sont construites pour les données, et les systèmes de fichiers basés sur les fichiers. Lorsque l'application Web a été créée, cette exportation n'était pas requise, de sorte que toute la gestion des fichiers était laissée au système de fichiers - ce que je pense toujours être la meilleure solution, et la pratique pour stocker les fichiers. –

+0

Quelle est la taille des images? Si elles sont inférieures à 1 Mo, la base de données peut les gérer assez bien. – GilaMonster

+0

Ils sont généralement inférieurs à 1 Mo, mais à la fin, changer la façon dont l'application entière gère les images utilisateur n'est pas vraiment une option dans ce cas. –

1

Si vous devez le faire depuis sql, vous pouvez utiliser xp_cmdshell et 'if exist'. Ceci n'est pas activé par défaut pour des raisons de sécurité, alors faites attention.

permettent xp_cmdshell:

sp_configure 'show advanced options', 1 
reconfigure 
sp_configure 'xp_cmdshell', 1 
reconfigure 

utilisation xp_cmdshell:

xp_cmdshell 'if exist c:\blargh.txt echo 1' 
+0

Doit-il être activé de manière permanente, ou est-il possible de l'activer simplement pendant l'exécution de la requête, puis de le désactiver à nouveau? Mais puisque tout le monde semble penser que c'est une mauvaise pratique, je vais probablement le résoudre d'une autre manière. –

+0

vous pouvez activer puis désactiver au besoin. – rorr

Questions connexes