2016-01-21 35 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';