SQL 服务器存储过程语法 return 从执行传递作业名称到 sp_stop_job retval

SQL Server stored procedure syntax to return retval from execute passing job name to sp_stop_job

我的 SQL 服务器体验很差,但是,必须维护一个旧的(非常旧的)SQL 服务器实例,我目前正在尝试编写一个复杂的存储过程,但它失败了(由于语法)当我尝试停止工作时。

所以,我现在正在努力寻找一个有效的语法来:

我正在尝试一些语法变体(由于某种原因都失败了),我想我糟糕的经历需要帮助和提示。我也试图从其他一些默认程序中发现(比如 sp_help_job

这是我最后一次尝试:

GO
SET ANSI_WARNINGS ON
GO
SET ANSI_NULLS ON
GO

CREATE PROCEDURE my_test_stop_job
    -- Individual job parameters
    @job_name                   sysname          = NULL  -- If provided should NOT also provide job_id

AS

BEGIN
    DECLARE @retval          INT

    -- Remove any leading/trailing spaces from parameters (except @owner_login_name)
    SELECT @job_name         = LTRIM(RTRIM(@job_name))

    -- Turn [nullable] empty string parameters into NULLs
    IF (@job_name         = N'') SELECT @job_name = NULL

    IF (@job_name IS NOT NULL)      
        BEGIN       
            EXECUTE ('@retval = EXECUTE msdb.dbo.sp_stop_job @job_name = ''' + @job_name + '''')

                    IF (@retval <> 0)
                            RETURN(1) -- Failure                        
                        ELSE                
                            RETURN(0) -- status OK

        END

END

GO

使用

启动
EXEC mydb.dbo.my_test_stop_job @job_name = 'jobname2bestopped'

未能给予:

must declare the variable '@retval'

如何做到这一点?谢谢

不需要动态-SQL:

CREATE PROCEDURE my_test_stop_job
    -- Individual job parameters
    @job_name                   sysname          = NULL  
AS
BEGIN
    DECLARE @retval          INT;

    -- Remove any leading/trailing spaces from parameters 
    SELECT @job_name         = LTRIM(RTRIM(@job_name));

    -- Turn [nullable] empty string parameters into NULLs
    IF (@job_name         = N'') SELECT @job_name = NULL;

    IF (@job_name IS NOT NULL)      
    BEGIN       
        EXECUTE @retval =  msdb.dbo.sp_stop_job @job_name = @job_name;

        IF (@retval <> 0)
            RETURN(1); -- Failure                        
        ELSE                
            RETURN(0); -- status OK
    END
END   
GO

此外,我建议在作业名称为 NULL 时设置 THROW 异常,否则您的存储过程将以代码 0.

退出

如果由于某种原因你需要动态-SQL,你可以使用 EXEC dbo.sp_executesqlOUTPUT 参数。