【问题标题】:Passing variable into xp_cmdshell将变量传递到 xp_cmdshell
【发布时间】:2016-02-29 03:45:16
【问题描述】:

我在 SQL Server 中有一个存储过程,用于检查今天的备份文件(文件名中有日期的文件)。检查后,它会移动到robocopy这些文件到另一个文件夹。

挑战:在这个文件夹中,可能有昨天或其他日期的文件。但是只需要今天的 bak 文件进行传输。

--@day 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' 

【问题讨论】:

    标签: sql-server variables xp-cmdshell


    【解决方案1】:

    在将命令传递给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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-13
      • 2018-06-02
      • 2018-03-23
      • 2014-01-22
      • 2018-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多