我一直在玩数据库备份自动化脚本,特别是在这个链接上的脚本:
http://support.microsoft.com/kb/2019698
我让一切工作正常,甚至使用7zip添加自动压缩,记录,并在vbscript的帮助下发送电子邮件预定通知。然而,即使没有这一切,你也可以看到这有点沉重。它现在很容易达到400行代码。
我真的不喜欢把我所有的东西放在这样的一个街区里,我想将它分开。所以我可以说一个名为BackupCompress.sql的压缩文件和一个名为BackupLogReport.sql的日志文件,所有这些文件都将从主Backup.sql脚本中调用。
Backup.sql脚本依次从Backup.bat文件运行,该文件设置为在调度程序中运行。
所有这些都像魅力一样。但是我不知道如何从BackupLogReport.sql中调用BackupCompress.sql并传入参数并获得返回值。
在Backup.bat文件中,我使用此命令来旋转所有内容并将参数传递给它:
SQLCMD -S %SQLDATABASE% -d master -i %BACKUP_FOLDER%\Backup.sql -v Pram1="%Pram1%"
在Backup.sql文件中,我只需通过以下方式获取这些参数:
DECLARE @Param1 NVARCHAR(256) = '$(Param)'
从那时起,当我的脚本运行时,它会使用我想传入的任何内容。
我尝试使用标准的sql存储过程逻辑来调用另一个这样的过程:
EXEC BackupCompress.sql
@AnotherParam = @Param1
我也尝试过:
EXECUTE sp_executesql BackupCompress.sql @Param1
最后我尝试了:
SET @cmd = 'SQLCMD -S ' + @@ServerName + ' -d master -i $(BACKUP_FOLDER)\BackupCompress.sql -v Param1 = ' + @Param1
EXEC xp_cmdshell @cmd, no_output
但它不起作用,我压缩的文件根本没有被压缩。我没有收到任何错误消息。其他一切继续正常。
编辑:我收到了最后一条错误消息,但我修复了它 - 但是,我仍然没有得到我的小zip文件。我甚至把print打印到文件中,看看它是否真的被执行但似乎没有。EDIT2:我尝试的另一个选项,几乎可以工作,但无法弄清楚如何将参数从sql文件传递到另一个文件......结果它产生了一个错误,说它无法找到该文件&# 39; s将路径视为文字字符串而不是我想传递的变量值。
:!!SQLCMD -S @@ServerName -d master -i @CFG_BACKUP_PATH\BackupCompress.sql -v Param1 = @Param1
答案 0 :(得分:1)
xp_cmdshell
可以返回值。这些值可以捕获到一个表变量中,您可以使用它来查看"结果,也许可以确定问题所在:
DECLARE @cmd VARCHAR(255);
DECLARE @Param1 NVARCHAR(256) = '$(Param)';
DECLARE @Results TABLE
(
ResultsText NVARCHAR(MAX)
);
SET @cmd = 'SQLCMD -S ' + @@ServerName + '-d master -i $(BACKUP_FOLDER)\$(BackupCompress.sql) -v Param1 = ' + @Param1;
SET @cmd = 'DIR \';
INSERT INTO @Results (ResultsText)
EXEC xp_cmdshell @cmd;
SELECT *
FROM @Results;
您需要通过执行以下命令确保为该实例启用xp_cmdshell
:
EXEC sp_configure 'xp_cmdshell',1;