web-dev-qa-db-fra.com

Comment écrivez-vous dans un dossier contenant des espaces?

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?

5
James

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.

8
Max Vernon

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.

6
billinkc