我的SQL代理中有一些预定的作业:
如您所见,多个作业可以同时运行.当这些作业同时运行时,它会导致CPU使用率达到100%.
有解决方案吗?有没有办法控制同时运行的作业数量?注意:我需要这些工作大约在适当的时间段内运行.
我目前正在使用这样的代码来检测SQL服务器作业是否正在运行.(这是SQL Server 2005,所有SP的)
return (select isnull(
(select top 1 CASE
WHEN current_execution_status = 4 THEN 0
ELSE 1
END
from openquery(devtestvm, 'EXEC msdb.dbo.sp_help_job')
where current_execution_status = 4 and
name = 'WQCheckQueueJob' + cast(@Index as varchar(10))
), 1)
)
Run Code Online (Sandbox Code Playgroud)
那里没有问题,一般来说,它运作得很好.
但....(总是一个但是)
有时,我会调用它,取回"工作未运行"的结果,此时我会尝试通过以下方式启动工作
exec msdb.dbo.sp_start_job @JobName
Run Code Online (Sandbox Code Playgroud)
并且SQL将返回"SQLAgent拒绝启动该作业,因为它已经有待处理的请求".
好.也不是问题.可以想象,在此代码启动之前,可以启动目标作业的一个小窗口,但在检查它是否已启动之后.但是,我可以将它包装在try catch中,然后忽略错误,对吧?
begin try
if dbo.WQIsQueueJobActive(@index) = 0 begin
exec msdb.dbo.sp_start_job @JobName
break
end
end try begin catch
-- nothing here
end catch
Run Code Online (Sandbox Code Playgroud)
不过这是问题所在.
10次中有9次,这很好用.SQL代理将引发错误,它被捕获,并且处理继续,因为作业已经运行,没有任何伤害没有犯规.
但偶尔,我会在"作业历史记录"视图中收到一条消息(请记住上面的代码,以检测特定作业是否正在运行,如果没有实际从另一个作业运行则启动它)说该作业失败,因为"SQLAgent已经拒绝开始工作,因为它已经有待处理的请求".
当然,这是TRY CATCH应该处理的确切错误!
当发生这种情况时,正在执行的工作就会消失,但不能立即从我所知道的情况开始,只是非常接近.我把日志记录到了所有地方并且没有一致性.有一次它失败了,它将在a处,a下一次在b处.在某些情况下,地方A和地方B只有一个
select @var = 'message'
Run Code Online (Sandbox Code Playgroud)
在他们之间.很奇怪.基本上,这项工作似乎是毫不客气地被抛弃的,而且在工作中要执行的任何事情都不会被执行.
但是,如果我删除"exec …
我有一个执行存储过程的步骤作业.我想获得上次成功执行作业的日期,以便我可以更新delta而不是整个数据集.
现在我的作业设置每天运行一次,所以我有一个默认参数,如果它为null我将它设置为GETDATE() - 1所以我还在更新delta但是我想要做的是设置上次成功执行作业的日期.
exec dbo.usp_UpdateFrom @LastSuccessfulExecutionTime
Run Code Online (Sandbox Code Playgroud)
目前的程序是这样的
CREATE PROCEDURE dbo.usp_UpdateFrom
@FromDate datetime = NULL --would like to pass last successful execution time of the job
AS
IF @FromDate IS NULL
SET @FromDate = GETDATE() - 1
-- do stuff
END
Run Code Online (Sandbox Code Playgroud) 我需要创建一个应用程序来监视SQL Server 2000代理作业状态和信息当作业发生时与Windows应用程序事件日志中显示相同.现在我已经通过连接字符串连接到数据库,但我不知道如何从Job获取状态和信息.
我需要在Textbox上显示状态和信息.
您有什么建议怎么办?
开发者工具 :
我是菜鸟程序员.
我有许多SQLServer代理预定作业,其中一个执行完整数据库备份.我希望在备份开始时禁用其他一些作业,并在备份完成后重新启用它们.这样做的正确方法是什么?我正在考虑将以下tsql命令之一添加到备份任务的第一步(以及相应的启用命令到最后一步),但我找不到哪一个更好(或者可能有另一种方式).
UPDATE MSDB.dbo.sysjobs
SET Enabled = 0
WHERE [Name] IN (....)
Run Code Online (Sandbox Code Playgroud)
还是一些EXEC dbo.sp_update_job?
谢谢.
在我的SQL Server代理中,我没有设置任何通知,那么为什么会出现此错误?
我运行pakg通过dtsexec它成功执行,我也运行一个简单的工作,插入记录它成功运行,但在工作步骤中我选择文件系统,并给出包路径和运行作业,它给了我错误:
Messenger服务尚未启动 - 将不会发送NetSend通知
我办理登机手续services.msc但没有像窗口信使这样的服务,我也检查过gpedit,有一个窗口信使,我应用它的所有三个选项启用,禁用,不一个一个配置,但没有摆脱该错误.
任何帮助将不胜感激,提前致谢.
有没有办法确定sql代理作业何时在使用sp_start_job启动后完成?
我的服务器已关闭,我只能从中获取硬盘.我找到了我的数据库并复制了它,但我可以在哪里找到代理工作?他们在哪里救了?
我已经安装了 SQL Server 2016 Express 版本,还安装了 SSMS 18.4,现在重新启动 SQL Server 代理服务时遇到问题。
我可以使用我的系统用户登录,但无法使用默认用户名登录,例如:dot (.) or (local) or saaccount。
我有很多工作,可以将1个特定的电子邮件发送到人员列表.这个reciepients列表在step命令中是硬编码的,我需要在所有作业中从该列表中删除一个人.
如何遍历Sql Server Agent中的所有作业并修改命令文本以查找+替换特定的文本.
我正在使用sql server 2005并且已经查看了sp_update_jobStep,但似乎并不是我想要的.
干杯.