2016-01-21 62 views
1

我有一个包含文件名,文件路径和新文件名的记录超过1000个的表。我想将现有文件从FileName重命名为NewFileName。是否有可能将这些文件从SQL Server 2012年改名从SQL Server 2012中重命名文件列表

enter image description here

我能为一个文件,这样做,但我有这样的多个文件的一个问题。

​​
+1

光标或'while'循环? – Rhumborl

+0

为什么你认为SQL Server会比批处理脚本更适合这个任务?是因为你已经在数据库中有了新的文件名,并且它们没有遵循明显的模式? – Bridge

+0

我已经在数据库中有名称,是的,新名称不遵循任何模式。 –

回答

3

如果需要,可以从SQL Server执行此操作。该解决方案依赖于重命名的信息存储在何处:


  1. 的信息存储在一个TABLE变量或临时表

    • 插入命名语句转换为全局临时表
    • 使用BCP将全局临时表导出到批处理文件
    • 执行批处理文件
    • 删除批处理文件
    • 掉落全局临时表

  • 的信息被存储在规则表

    • 使用BCP将查询导出到批处理文件
    • 执行批处理文件
    • 删除批处理文件

  • 例脚本壳体1(TABLE变量,临时表):

    SET NOCOUNT ON; 
    
    DECLARE @fn TABLE(
        file_path VARCHAR(1024), 
        new_file_name VARCHAR(256) 
    ); 
    
    INSERT INTO @fn(file_path,new_file_name)VALUES 
        ('C:\Temp\A.txt','A_new.txt'), 
        ('C:\Temp\B.txt','B_new.txt'), 
        ('C:\Temp\C.txt','C_new.txt'); 
    
    SELECT 
        'rename "'+file_path+'" "'+new_file_name+'"' AS stmt 
    INTO 
        ##cmd_output 
    FROM 
        @fn; 
    
    DECLARE @cmd VARCHAR(8000); 
    SET @cmd='BCP "SELECT stmt FROM ##cmd_output" QUERYOUT "C:\Temp\rename_all.bat" -c -T -S ' + @@SERVERNAME; 
    EXEC master..xp_cmdshell @cmd; 
    EXEC master..xp_cmdshell 'C:\Temp\rename_all.bat'; 
    EXEC master..xp_cmdshell 'DEL C:\Temp\rename_all.bat'; 
    
    DROP TABLE ##cmd_output; 
    

    例脚本壳体2(常规表):

    CREATE TABLE file_renames(
        file_path VARCHAR(1024), 
        new_file_name VARCHAR(256) 
    ); 
    GO 
    
    INSERT INTO file_renames(file_path,new_file_name)VALUES 
        ('C:\Temp\A.txt','A_new.txt'), 
        ('C:\Temp\B.txt','B_new.txt'), 
        ('C:\Temp\C.txt','C_new.txt'); 
    
    DECLARE @cmd VARCHAR(8000); 
    SET @cmd='BCP "SELECT ''rename ""''+file_path+''"" ""''+new_file_name+''""'' AS stmt FROM file_renames" QUERYOUT "C:\Temp\rename_all.bat" -c -T -S ' + @@SERVERNAME + ' -d ' + DB_NAME(); 
    EXEC master..xp_cmdshell @cmd; 
    EXEC master..xp_cmdshell 'C:\Temp\rename_all.bat'; 
    EXEC master..xp_cmdshell 'DEL C:\Temp\rename_all.bat';