J'ai un tas de packages SSIS simples qui produisent des données SQL vers Excel, puis je renomme les fichiers et les déplace vers l'utilisateur final.
Certains d'entre eux utilisent des chemins d'accès aux fichiers contenant des espaces, et ils ne sont pas ravis d'utiliser de nouveaux dossiers. Voici le code que j'utilise:
declare @date varchar(25),
@sql varchar(1000)
set @date = cast(datepart(month, current_timestamp) as varchar(2)) + '_' + cast(datepart(day, current_timestamp) as varchar(2)) + '_' + cast(datepart(year, current_timestamp) as varchar(4))
print @date
set @sql = 'copy D:\Data\ED_72.xlsx \\ehsintra3\ED_72_weekly\ED_72_' + @date + '.xlsx';
print @sql
exec xp_cmdshell @sql
mais cela ne fonctionnerait pas sans les soulignés.
Question comment puis-je faire ce travail sans souligner?
Vous devez (presque toujours) inclure des chemins entre guillemets. Donc, comme ça:
declare @date varchar(25),
@sql varchar(1000);
set @date = cast(datepart(month, current_timestamp) as varchar(2)) + ' ' + cast(datepart(day, current_timestamp) as varchar(2)) + ' ' + cast(datepart(year, current_timestamp) as varchar(4));
print @date;
set @sql = 'copy "D:\Data\ED_72.xlsx" "\\ehsintra3\ED 72 weekly\ED 72 ' + @date + '.xlsx"';
print @sql;
exec xp_cmdshell @sql;
Mettre des chemins entre guillemets garantit que le processeur de commandes peut comprendre où commence et se termine un chemin.
De plus, au lieu d'utiliser copy
, vous voudrez probablement regarder robocopy
ou xcopy
. La commande copy
est brutalement faible et fragile.
En outre, une note mineure, ajoutez des points-virgules à la fin de vos instructions dans T-SQL.
L'autre approche consiste à utiliser la tâche de système de fichiers dans SSIS lui-même. Il gère les noms de chemins et de fichiers "complexes" sans le rigmarole et les risques de xp_cmdshell
s'échappant.
Quel risque? Il y a une limite aux arguments entre guillemets doubles.
Voir aussi Paramètres de commande d'échappement passés à xp_cmdshell à dtexec sur Stack Overflow.