SQL Server存储过程语法返回RETVAL从执行传递任务名sp_stop_job
问题描述:
我有一个可怜的SQL Server的经验,但是,必须维护一个老(很旧的)SQL Server实例,我正在尝试写一个复杂的存储程序,但是当我尝试时,它会失败(由于语法),例如,停止工作。SQL Server存储过程语法返回RETVAL从执行传递任务名sp_stop_job
所以,我现在正在努力寻找工作的语法:
- 执行msdb.sp_stop.job
- 通过它我已经存储到@job_name变量
- 作业名返回一个(声明的)@retval变量,以便稍后了解该作业是否实际停止。
我在尝试一些语法变体(所有失败的原因),我想我的经验不足,需要帮助,提示。我试图从其他一些默认的程序被发现,太(如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
此外,我建议THROW
异常,当作业名称是NULL
否则你的存储过程将使用代码0
退出。
如果因为某种原因,你需要动态SQL,你可以使用EXEC dbo.sp_executesql
与OUTPUT
参数。
这形式更像是我的第一个变种,但我尝试(使用+和字符串分隔符)撰写的“@job_name = @job_name”用绳子/可变串联......我会尽力尽快与您上面有什么建议...关于扔,这只是一个测试,整个过程更好地处理这个retval ..谢谢。 –
@ m.ardito你应该做的级联/其他文本操作执行之前,只是通过变量名'EXEC过程@job_name = @ job_name' – lad2025
好吧,我想和工作......我之前猜测的过程需要一些特别的东西来区分两个“@job_name”的含义......所以我试图用引号来连接两个...谢谢。 –