在完成一个重要设计后,需要手动备份下数据库,之前是登录服务器,今天抽时间做了在WorkFine应用端执行存储过程备份,实现不登录服务器备份。
老办法->直接问AI
问AI回复
在 SQL Server 中,维护计划本质上是 SQL Server 代理(SQL Server Agent)作业(Job)。因此,要通过存储过程触发名为“备份用户数据库”的维护计划,实际上就是通过存储过程来启动对应的 SQL Server 代理作业。
你可以使用系统存储过程 sp_start_job 来实现。
方法:使用 sp_start_job
EXEC msdb.dbo.sp_start_job @job_name = N'备份用户数据库';
说明:
- msdb.dbo.sp_start_job:
- 这是 SQL Server 系统提供的存储过程,用于启动 SQL Server 代理作业。
- 它位于 msdb 系统数据库中。
- @job_name:
- 参数,用于指定要启动的作业名称。
- 名称必须与 SQL Server 代理中实际的作业名称完全匹配(包括大小写和空格)。
- N’…’:
- N 表示这是一个 Unicode 字符串(nvarchar),对于包含中文的名称是推荐的做法。
前提条件:
- SQL Server 代理服务必须正在运行。如果代理服务停止,作业将无法启动。
- 你执行此命令的账户需要具有启动 SQL Server 代理作业的权限。通常,sysadmin 固定服务器角色的成员或被明确授予了作业操作权限的用户可以执行此操作。
如何确认作业名称?
维护计划创建的作业名称通常与维护计划名称相同,但有时可能略有不同(例如,可能包含服务器名或GUID后缀)。为了确保名称正确,建议你先查询一下作业列表:
USE msdb;
GO
SELECT
name AS JobName,
enabled AS IsEnabled,
date_created AS DateCreated,
date_modified AS DateModified
FROM
dbo.sysjobs
WHERE
name LIKE N'%备份用户数据库%'; -- 使用模糊查询查找
运行以上查询,找到确切的作业名称,然后在 sp_start_job 中使用它。
示例(封装成自定义存储过程)
你也可以创建一个自定义存储过程来封装这个逻辑:
USE YourDatabase; -- 替换为你想存放此存储过程的数据库
GO
CREATE PROCEDURE dbo.StartBackupUserDB
AS
BEGIN
SET NOCOUNT ON;
-- 检查 SQL Server Agent 是否运行(可选)
-- 实际上 sp_start_job 会直接尝试启动,如果代理没运行会报错
BEGIN TRY
EXEC msdb.dbo.sp_start_job @job_name = N'备份用户数据库';
PRINT '维护计划 "备份用户数据库" 已成功启动。';
END TRY
BEGIN CATCH
DECLARE @ErrorMessage NVARCHAR(4000) = ERROR_MESSAGE();
DECLARE @ErrorSeverity INT = ERROR_SEVERITY();
DECLARE @ErrorState INT = ERROR_STATE();
RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState);
END CATCH
END;
GO
之后,你就可以通过执行 EXEC dbo.StartBackupUserDB; 来触发该维护计划了。
总结
使用 EXEC msdb.dbo.sp_start_job @job_name = N’你的维护计划名称’; 是触发 SQL Server 维护计划的标准方法。关键是确保作业名称准确无误,并且 SQL Server 代理服务正在运行。
实践示例

USE WF_WZGL; -- 替换为你想存放此存储过程的数据库
GO
CREATE PROCEDURE dbo.StartBackupUserDB
AS
BEGIN
SET NOCOUNT ON;
-- 检查 SQL Server Agent 是否运行(可选)
-- 实际上 sp_start_job 会直接尝试启动,如果代理没运行会报错
BEGIN TRY
EXEC msdb.dbo.sp_start_job @job_name = N'备份用户数据库.Subplan_1';
PRINT '维护计划 "备份用户数据库" 已成功启动。';
END TRY
BEGIN CATCH
DECLARE @ErrorMessage NVARCHAR(4000) = ERROR_MESSAGE();
DECLARE @ErrorSeverity INT = ERROR_SEVERITY();
DECLARE @ErrorState INT = ERROR_STATE();
RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState);
END CATCH
END;
GO
运行结果

在WorkFine添加


存储过程功能比较强大,可以充分发挥SQL Server数据库功能,可以适时在WorkFine中调用存储过程功能
相关文章
© 版权声明
THE END















