2010-09-14 13 views
1

est-il possible d'appeler 7-zip à partir d'un script SQL? Fondamentalement, je suis en train d'extraire des tables à CSV, puis les emballer dans des fichiers 7z. J'ai installé 7-zip sur la machine où SQL Server est installé et l'a ajouté au chemin, mais cela ne semble pas suffisant.exécuter 7-zip à partir d'un script SQL

je reçois l'erreur suivante lorsque je tente d'exécuter le script avec xp_cmdshell

'7z' is not recognized as an internal or external command, 
operable program or batch file. 

c'est le code, je l'ai déjà déclaré les variables

declare @archiveCommand nvarchar(max) 
declare @filename nvarchar(max) 

set @archiveCommand = '7z a '[email protected]+'.7z '[email protected]+' ' 
print @archiveCommand 
EXEC master..xp_cmdshell @archiveCommand 
+0

'a ajouté à la path' où avez-vous ajouté le chemin? –

+0

Etes-vous sûr que 7z se trouve dans le chemin du compte d'utilisateur utilisateur qui exécute le serveur SQL? –

+1

Avez-vous redémarré le serveur après avoir modifié PATH? –

Répondre

2

Il est possible, oui, mais probablement une mauvaise idée: les permissions sont souvent un problème (comme vous l'avez découvert), les chemins et les répertoires de travail vont vous trébucher, et construire des commandes shell dans SQL est un problème. Il serait beaucoup plus simple d'utiliser un script externe et de l'exécuter à partir d'un travail planifié ou d'un package SSIS.

Si vous clarifiez exaclty pourquoi et quand vous voulez exécuter le script à partir de SQL alors quelqu'un peut être en mesure de suggérer une meilleure approche. Je fais exactement la même chose en utilisant SSIS et Python, par exemple.

+0

J'essaye juste d'automatiser un processus ainsi je ne dois pas courir la commande manuellement pour chaque table que je traite. la question du chemin n'est pas vraiment un problème pour moi, je peux juste utiliser des chemins absolus et éviter cela. Je peux probablement le faire à travers un script externe mais serait agréable et impressionnant de pouvoir le faire au sein du serveur sql. Je vais seulement courir cela rarement, donc ce n'est pas vraiment un gros problème. Si cela ne peut pas être fait sans ennui majeur, alors ne vous inquiétez pas, je vais le faire manuellement. – warsong

+0

Je ne sais pas pourquoi un script externe est "manuel"? Le script peut interroger la liste des tables, générer et exécuter une commande bcp.exe pour eaach, puis faire la même chose pour 7z.exe. Ensuite, vous n'avez qu'à maintenir la liste des tables. Mon expérience personnelle est que travailler avec des fichiers et des systèmes de fichiers est si pénible en SQL que cela ne vaut pas la peine, mais il est évident que les choses peuvent être différentes dans votre environnement. – Pondlife

+0

désolé je voulais dire manuel comme dans sans un script. Je pense que si ce n'est pas possible/facile dans SQL Server, je vais le faire manuellement, ce qui est la façon dont je le fais actuellement. J'ai des problèmes pour obtenir le serveur SQL pour reconnaître le 7z.exe, il continue à dire qu'il ne peut pas le voir, même si je l'ai redémarré. – warsong

3

Je ne sais pas si cela sera utile maintenant, mais j'ai rencontré ce problème et l'ai résolu en appelant l'application 7z avec le nom du fichier.

Ainsi, au lieu de:

set @archiveCommand = '7z a '[email protected]+'.7z '[email protected]+' '

Vous voulez:

set @archiveCommand = '"C:\Program Files\7-zip\7z" a '[email protected]+'.7z '[email protected]+' '

+0

+1 Oui acclamations très utiles. Parfois, l'évidence évite la capture (cette évidente sournoise). – Ben

+0

Ceci est la solution - pas besoin de définir le chemin, etc. Brillant. – Fearghal