【问题标题】:SQL Server Calling a stored procedure from another stored procedure at the command lineSQL Server 在命令行从另一个存储过程调用一个存储过程
【发布时间】:2014-08-07 17:57:02
【问题描述】:

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

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's 放入文件中,看看它是否真的被执行了,但似乎没有。

EDIT2:我尝试过的另一个选项,几乎可以工作,但无法弄清楚如何将参数从 sql 文件中传递到另一个文件......结果它会生成一个错误,说它在处理时找不到文件路径作为文字字符串而不是我要传递的变量值。

:!!SQLCMD -S @@ServerName -d master -i @CFG_BACKUP_PATH\BackupCompress.sql -v Param1 = @Param1

【问题讨论】:

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


    【解决方案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;

    【讨论】:

    • 嗨。谢谢你的帮助。我在语法 $(BackupCompress.sql) 上犯了一个小错误,应该简单地读为 BackupCompress.sql。通过根据您的建议进行此更改,我可以调用该文件。但是,我无法访问 BackupCompress.sql 中的 Param1。我什至还没有教过结果。但是目录 \ 做得很好。它会产生影响。
    • Sp_executesql 支持传入传出参数。查看 MSDN 文档了解详细信息。
    • 这很有趣...我之前尝试过一段时间让 SP_executesql 工作,但似乎还很遥远。不过不确定。到目前为止,我感谢您的努力,但是我想念 sp_executesql 与您给出的答案之间的联系。我在 sp_ex 的问题中给出的示例是我所得到的,而我与 msdn 文档相距甚远。所以我不知道该部分如何从另一个文件中读取信息。它有点超出我的范围。再次。感谢您的帮助。
    猜你喜欢
    • 2012-02-10
    • 2013-03-26
    • 2014-09-17
    • 2021-01-26
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    相关资源
    最近更新 更多