SQL Server 2012 中的文件重命名列表

Rename list of files from SQL Server 2012

我有一个 table,它有 1000 多条记录,包括文件名、文件路径和新文件名。我想将现有文件从 FileName 重命名为 NewFileName。是否有可能从 SQL Server 2012.

重命名这些文件

我可以对一个文件执行此操作,但对多个文件执行此操作时遇到问题。

DECLARE @cmd varchar(1000)
SET @cmd = 'rename C:\Test\A.txt A_new.txt'
EXEC master..xp_cmdshell @cmd 

如果需要,您可以从 SQL 服务器执行此操作。解决方案取决于重命名信息的存储位置:


  1. 信息存储在TABLE变量或临时Table

    • 将重命名语句插入全局临时文件table
    • 使用BCP将全局临时文件table导出到批处理文件
    • 执行批处理文件
    • 删除批处理文件
    • 删除全局临时文件table

  1. 信息存储在常规table

    • 使用 BCP 将重命名语句导出到批处理文件
    • 执行批处理文件
    • 删除批处理文件

Example script for case 1 (TABLE variables, Temporary Tables):

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;

Example script for case 2 (regular tables):

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';