2016-02-29 4 views
2

У меня есть хранимая процедура на SQL Server, которая проверяет текущие резервные файлы (файлы с датой в имени файла). После проверок он переместится на robocopy эти файлы в другую папку.Передача переменной в xp_cmdshell

Задача: В этой папке могут быть файлы со вчерашних или других дат. Но для передачи нужны только сегодняшние файлы bak.

[email protected] allows me to capture the day of a month 
declare @day char(2) 
set @day = RIGHT('00' + CONVERT(NVARCHAR(2),DATEPART(DAY,GETDATE())),2) 
--print @day 

--In "MyFolder", it might containts files like 
--Project_backupfile_01_2006_02_28_001.bak 
--OR Project_backupfile_01_2006_02_27_001.bak 

--Currently I need to hard code 28 to represent 28th. How to pass in @day? 
EXEC master..xp_cmdshell 'dir d:\myfolder\Project*28*.bak/b' 

--Similarly, I would like to pass in @day variable so that the --Project_backupfile*02_*@day.bak 

-- Copy the backup fules from ftp to a local drive 
EXEC master..xp_cmdshell 'robocopy "d:\source" "E:\MSSQL\Restore\" Project_backupfile*_02_28*.bak /NFL /NDL /COPY:DAT /R:2 /W:1 /XO /E /Z /MT:10' 

ответ

6

Используйте переменную, чтобы сформировать команду перед передачей его xp_cmdshell

declare @cmd varchar(100) 
select @cmd = 'dir d:\myfolder\Project*' + datename(day, getdate()) + '*.bak/b' 
-- print @cmd 
exec master..xp_cmdshell @cmd 

Примечание: datename(day, getdate()) даст вам день месяца в виде строки.

stuff(convert(varchar(5), getdate(), 101), 3, 1, '_') даст вам 02_28

Смежные вопросы