如何在SQL查询末尾输出数据库总大小并导出结果到CSV
SQL数据库空间统计:添加总计行与导出CSV方案
一、实现数据库大小总和统计
你的现有查询通过GROUPING SETS实现了按数据库及文件类型的统计,但缺少总计行。可以通过扩展GROUPING SETS添加全局总计分组,同时用GROUPING()函数标识总计行,调整后的代码如下:
SELECT [Server Name] = @@SERVERNAME, [Database Name] = CASE WHEN GROUPING(DB_NAME(database_id)) = 1 THEN '**总计**' ELSE DB_NAME(database_id) END, [Size in MB] = CAST(((SUM(Size)* 8) / 1024.0) AS DECIMAL(18,2)), [Customer] = CASE WHEN GROUPING(DB_NAME(database_id)) = 1 THEN '所有客户' WHEN DB_NAME(database_id) = 'xxxx' THEN 'xxxx' WHEN DB_NAME(database_id) IN ('ARSystem', 'xxxx', 'SmartReporting') THEN 'xxxx' ELSE 'Unknown' END, [Area] = CASE WHEN GROUPING(DB_NAME(database_id)) = 1 THEN '全区域' WHEN SUBSTRING(@@SERVERNAME,3,3) = 'uxx' THEN 'xxxx' ELSE '????' END FROM sys.master_files WHERE DB_NAME(database_id) NOT IN ('master', 'tempdev','tempdb') GROUP BY GROUPING SETS ( (@@SERVERNAME, DB_NAME(database_id), Type_Desc), (@@SERVERNAME, DB_NAME(database_id)), (@@SERVERNAME) -- 添加全局总计分组 ) ORDER BY CASE WHEN GROUPING(DB_NAME(database_id)) = 1 THEN 1 ELSE 0 END, -- 总计行放最后 DB_NAME(database_id), Type_Desc DESC
关键说明:
- 新增
@@SERVERNAME列匹配输出示例的服务器名称格式 - 用
GROUPING(DB_NAME(database_id)) = 1判断总计行,对应列显示汇总标识 - 在
GROUPING SETS中加入(@@SERVERNAME)分组,实现全局大小总和计算
如果需要单独输出MB/GB/TB格式的总计文本,可追加以下语句:
DECLARE @TotalMB DECIMAL(18,2) SELECT @TotalMB = CAST(((SUM(Size)* 8) / 1024.0) AS DECIMAL(18,2)) FROM sys.master_files WHERE DB_NAME(database_id) NOT IN ('master', 'tempdev','tempdb') SELECT '已使用磁盘空间总计(MB): ' + FORMAT(@TotalMB, 'N2') AS 总计信息 UNION ALL SELECT '已使用磁盘空间总计(GB): ' + FORMAT(@TotalMB/1024, 'N2') AS 总计信息 UNION ALL SELECT '已使用磁盘空间总计(TB): ' + FORMAT(@TotalMB/(1024*1024), 'N2') AS 总计信息
二、将查询结果导出为CSV文件
方法1:SSMS图形界面导出
- 执行查询后,右键结果集→选择「保存结果」
- 在保存对话框中选择类型为
CSV(逗号分隔)(*.csv),指定路径完成保存
方法2:bcp命令行导出
打开命令提示符,替换占位符后执行:
bcp "你的完整查询语句" queryout "C:\目标路径\db_space.csv" -S 你的服务器实例名 -U 用户名 -P 密码 -c -t, -r\n
参数说明:
-c:字符格式导出-t,:逗号作为列分隔符-r\n:换行符作为行分隔符
方法3:T-SQL语句直接导出
需先开启Ad Hoc Distributed Queries配置(仅执行一次):
sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'Ad Hoc Distributed Queries', 1; RECONFIGURE;
再执行导出语句:
INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Text;Database=C:\目标路径\;HDR=YES;FMT=Delimited', 'SELECT [Server Name],[Database Name],[Size in MB],Customer,Area FROM [db_space.csv]') SELECT @@SERVERNAME AS [Server Name], DB_NAME(database_id) AS [Database Name], CAST(((SUM(Size)* 8) / 1024.0) AS DECIMAL(18,2)) AS [Size in MB], CASE WHEN DB_NAME(database_id) = 'xxxx' THEN 'xxxx' WHEN DB_NAME(database_id) IN ('ARSystem', 'xxxx', 'SmartReporting') THEN 'xxxx' ELSE 'Unknown' END AS Customer, CASE WHEN SUBSTRING(@@SERVERNAME,3,3) = 'uxx' THEN 'xxxx' ELSE '????' END AS Area FROM sys.master_files WHERE DB_NAME(database_id) NOT IN ('master', 'tempdev','tempdb') GROUP BY GROUPING SETS ( (DB_NAME(database_id), Type_Desc), (DB_NAME(database_id)) )
内容的提问来源于stack exchange,提问作者adriano
相关产品推荐
相关产品推荐

