SQL Server在命令行中从另一个存储过程调用存储过程

时间:2014-08-07 17:57:02

标签: sql sql-server sql-server-2008 stored-procedures sql-server-2012

我一直在玩数据库备份自动化脚本,特别是在这个链接上的脚本:

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

1 个答案:

答案 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;