厌倦了数据库、设计端之间来回奔波,那就使用此方法解决吧。
应用场景
写好了回写公式,做测试前总要备份下数据库,确保万无一失。之前写了备份全部用户数据库的存储过程,感觉不够灵活,需要一个指定数据库备份、查看备份结果的功能
效果展示
![图片[1]-在WorkFine应用端备份指定数据库并记录日志-本牛千智丨专注WorkFine开发](https://www.bn1000.com/wp-content/uploads/2025/10/20251005011133619-1005_011048_bn1000.com_.jpg)
视频演示
实现方法
- 创建日志记录表
- 创建存储过程
- 引入WorkFine,外部数据源
- 在WorkFine设置按钮 => 存储过程
- 在WorkFine设置取值公式获取引入的外部数据源日志记录表
相关SQL语句
创建日志记录数据表
USE WF_WZGL; -- 也可以选择其他数据库,如 msdb 或自定义的 DBA 数据库
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'BackupLog')
BEGIN
CREATE TABLE BackupLog (
Id INT IDENTITY(1,1) PRIMARY KEY,
DatabaseName NVARCHAR(128) NOT NULL, -- 数据库名称
BackupStartTime DATETIME NOT NULL DEFAULT GETDATE(), -- 开始时间
BackupFileSizeMB DECIMAL(10,2) NULL, -- 备份文件大小(MB)
BackupFilePath NVARCHAR(500) NOT NULL, -- 文件路径
Status NVARCHAR(50) NOT NULL DEFAULT 'Success' -- 状态:Success / Failed
);
PRINT '✅ 日志表 [BackupLog] 已创建。';
END
ELSE
BEGIN
PRINT 'ℹ️ 日志表 [BackupLog] 已存在。';
END
![图片[2]-在WorkFine应用端备份指定数据库并记录日志-本牛千智丨专注WorkFine开发](https://www.bn1000.com/wp-content/uploads/2025/10/20251005005709757-1005_003012_bn1000.com_.jpg)
创建存储过程语句
语句介绍
该脚本在 WF_WZGL 数据库中创建一个名为 BackupDatabase 的存储过程,用于:
- 自动备份指定数据库到
C:\tempbak\路径 - 文件名包含数据库名和时间戳(如:
WF_WZGL_20251005_012000.bak) - 记录备份开始时间、路径和状态(成功/失败)到
BackupLog表 - 支持重复执行,失败自动捕获并记录错误
USE WF_WZGL;
-- 当前数据库设为 WF_WZGL
-- 如果已存在同名存储过程,则删除
IF EXISTS (SELECT * FROM sys.procedures WHERE name = 'BackupDatabase' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
DROP PROCEDURE dbo.BackupDatabase;
END
;
-- 使用动态 SQL 创建存储过程
DECLARE @SQL NVARCHAR(MAX) = '
CREATE PROCEDURE dbo.BackupDatabase
@DatabaseName NVARCHAR(128)
AS
BEGIN
SET NOCOUNT ON;
-- 声明变量
DECLARE @BackupPath NVARCHAR(500) = ''C:\tempbak\'';
DECLARE @FileName NVARCHAR(500);
DECLARE @DateTime NVARCHAR(50);
DECLARE @SQLCmd NVARCHAR(2000);
DECLARE @BackupStartTime DATETIME = GETDATE();
DECLARE @Status NVARCHAR(50) = ''Success'';
-- 检查数据库是否存在
IF NOT EXISTS (SELECT 1 FROM sys.databases WHERE name = @DatabaseName)
BEGIN
RAISERROR(''❌ 错误:数据库 "%s" 不存在。'', 16, 1, @DatabaseName);
-- 记录失败日志(FileSize 为 NULL)
INSERT INTO dbo.BackupLog (DatabaseName, BackupStartTime, BackupFileSizeMB, BackupFilePath, Status)
VALUES (@DatabaseName, @BackupStartTime, NULL, '''', ''Failed: Database not found'');
RETURN;
END
-- 确保路径以反斜杠结尾
IF RIGHT(@BackupPath, 1) <> ''\''
SET @BackupPath = @BackupPath + ''\'';
-- 生成时间戳
SET @DateTime = CONVERT(VARCHAR(20), @BackupStartTime, 112) + ''_'' +
REPLACE(CONVERT(VARCHAR(8), @BackupStartTime, 108), '':'', '''');
-- 构造备份文件名
SET @FileName = @BackupPath + @DatabaseName + ''_'' + @DateTime + ''.bak'';
-- 输出信息
PRINT ''📌 开始备份数据库:'' + @DatabaseName;
PRINT ''📁 备份文件路径:'' + @FileName;
-- 构建备份命令
SET @SQLCmd = ''BACKUP DATABASE ['' + @DatabaseName + ''] TO DISK = '''''' + @FileName + '''''' WITH INIT, COMPRESSION, STATS = 5'';
-- 执行备份
BEGIN TRY
EXEC sp_executesql @SQLCmd;
-- 记录成功日志,FileSize 为 NULL
INSERT INTO dbo.BackupLog (DatabaseName, BackupStartTime, BackupFileSizeMB, BackupFilePath, Status)
VALUES (@DatabaseName, @BackupStartTime, NULL, @FileName, ''Success'');
PRINT ''✅ 成功:数据库 "'' + @DatabaseName + ''" 已备份(文件大小未记录)。'';
END TRY
BEGIN CATCH
SET @Status = ''Failed: '' + LEFT(ERROR_MESSAGE(), 200);
-- 记录失败日志
INSERT INTO dbo.BackupLog (DatabaseName, BackupStartTime, BackupFileSizeMB, BackupFilePath, Status)
VALUES (@DatabaseName, @BackupStartTime, NULL, @FileName, @Status);
DECLARE @ErrorMessage NVARCHAR(4000) = ERROR_MESSAGE();
RAISERROR(''❌ 备份失败 - %s'', 16, 1, @ErrorMessage);
END CATCH
END
';
-- 执行动态创建存储过程
EXEC sp_executesql @SQL;
-- 验证是否创建成功
IF EXISTS (SELECT * FROM sys.procedures WHERE name = 'BackupDatabase' AND schema_id = SCHEMA_ID('dbo'))
PRINT '✅ 存储过程 [WF_WZGL.dbo.BackupDatabase] 已成功创建或更新(已移除文件大小获取)。';
ELSE
PRINT '❌ 存储过程创建失败,请检查错误信息。';
查看备份文件大小
![图片[3]-在WorkFine应用端备份指定数据库并记录日志-本牛千智丨专注WorkFine开发](https://www.bn1000.com/wp-content/uploads/2025/10/20251005005652336-1005_002939_bn1000.com_.jpg)
-- 手动查询备份历史(可选)
USE msdb;
SELECT
database_name,
backup_start_date,
CAST(backup_size / 1024.0 / 1024.0 AS DECIMAL(10,2)) AS SizeMB,
physical_device_name
FROM msdb.dbo.backupset b
JOIN msdb.dbo.backupmediafamily m ON b.media_set_id = m.media_set_id
WHERE database_name = 'WF_WZGL'
ORDER BY backup_start_date DESC;
相关文章
© 版权声明
THE END


![SQL错误[156][S0001]:关键字key附近有语法错误(数据库保留字段查询方法)-本牛千智丨专注WorkFine开发](https://www.bn1000.com/wp-content/uploads/2025/05/20250530165142712-SQL语句.jpg)












