按日期将文件从一个目录复制到另一个目录

时间:2009-02-04 12:10:38

标签: sql sql-server xp-cmdshell

我有这个SQL作业(在SQL Server 2005中)每六(6)小时创建一次备份,备份的文件名基于时间戳,因此它将创建一个唯一的文件名(dbname_yyyymmddhhmmss.bak),现在我的问题是,如果文件是三天,我怎么知道使用xp_cmdshell并根据我的脚本我想删除三天前的备份(.bak)。有人可以帮助我,提前谢谢。干杯!

4 个答案:

答案 0 :(得分:4)

我同意xp_cmdshell不是这项工作的最佳选择。如果你像我一样,你不喜欢/信任维护计划,你可以编写一个C#控制台应用程序,其中文件系统支持比你在DOS中做的要强得多(或使用T-SQL来解析输出xp_cmdshell'DIR ...'),然后在Windows计划任务中安排,以便您不必担心从SQL Server服务/代理帐户升级权限。虽然将所有东西放在一个包中很好,但你并不总是希望那些改变油的人能让你成为一个乳蛋饼。

答案 1 :(得分:1)

这不是一个适合xp_cmdshell的任务。在SQL Server中启用此功能也具有安全隐患。

您希望实现的目标更适合SQL Server Integration Services(SSIS)。有可用于管理和执行备份的组件,以及可用于移动和删除数据的文件系统任务组件。

您可以使用文件系统任务,变量和表达式的组合来检索备份文件名,提取日期组件并确定文件的年龄。然后,您可以对该文件采取适当的操作。

我希望这会有所帮助,但如果您需要其他信息,请随时提出进一步的问题。

干杯,约翰

答案 2 :(得分:1)

这不是您的问题的答案,但您可以在SqlServer 2005中使用维护计划(对象资源管理器 - >管理 - >维护计划)直接执行此操作。

我通常会创建一个维护计划,其中包括两个任务:一个“维护清理任务”,在x天后删除旧备份,然后是“备份数据库任务”。

答案 3 :(得分:0)

您可以编写.NET程序集并从SQL Server中调用它。编写它会相当容易,因此表值函数会返回某个目录中包含文件名和文件日期戳的所有文件。