You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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图形界面导出

  1. 执行查询后,右键结果集→选择「保存结果」
  2. 在保存对话框中选择类型为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 10:48:22