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

SQL Server中批量统计全表各列指定字符出现次数的方法

嘿,这个需求我太熟了!要在SQL Server里遍历临时表#tvshows的所有列,统计每列中|的出现次数,还得适配任意列数,完全不用给每列写重复代码,用动态SQL就搞定了。下面给你两种方案,分别适配不同版本的SQL Server:

方案一:SQL Server 2017及以上版本(支持STRING_AGG)

这个版本用STRING_AGG拼接列的统计语句非常方便,代码如下:

DECLARE @DynamicSQL NVARCHAR(MAX);

-- 构建动态SQL语句,遍历所有列生成统计逻辑
SELECT @DynamicSQL = STRING_AGG(
    CONCAT(
        'SELECT ''', name, ''' AS ColumnName, ',
        'SUM(ISNULL(LEN(', QUOTENAME(name), ') - LEN(REPLACE(', QUOTENAME(name), ', ''|'', '''')), 0)) AS VerticalBarCount ',
        'FROM #tvshows'
    ),
    ' UNION ALL '
)
FROM sys.columns
WHERE object_id = OBJECT_ID('tempdb..#tvshows'); -- 定位临时表#tvshows

-- 执行动态SQL
EXEC sp_executesql @DynamicSQL;

代码解释:

  • sys.columns:系统视图,用来获取#tvshows的所有列名,通过OBJECT_ID('tempdb..#tvshows')定位临时表(临时表默认存在tempdb库中)。
  • STRING_AGG:把每列对应的统计SQL用UNION ALL拼接起来,形成完整的查询语句。
  • LEN(col) - LEN(REPLACE(col, '|', '')):核心逻辑,计算单个单元格中|的数量——替换掉所有|后,原长度和新长度的差值就是该单元格里|的个数。
  • ISNULL(..., 0):处理NULL值,因为NULL列的LEN结果是NULL,转换成0避免统计错误。
  • SUM(...):对整列的所有行求和,得到该列中|的总出现次数。

方案二:SQL Server 2016及更早版本(不支持STRING_AGG)

如果你的SQL Server版本比较老,用FOR XML PATH来拼接字符串:

DECLARE @DynamicSQL NVARCHAR(MAX);

-- 构建动态SQL语句
SELECT @DynamicSQL = STUFF(
    (
        SELECT ' UNION ALL ' +
            CONCAT(
                'SELECT ''', name, ''' AS ColumnName, ',
                'SUM(ISNULL(LEN(', QUOTENAME(name), ') - LEN(REPLACE(', QUOTENAME(name), ', ''|'', '''')), 0)) AS VerticalBarCount ',
                'FROM #tvshows'
            )
        FROM sys.columns
        WHERE object_id = OBJECT_ID('tempdb..#tvshows')
        FOR XML PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)'),
    1, 11, '' -- 去掉开头多余的' UNION ALL '
);

-- 执行动态SQL
EXEC sp_executesql @DynamicSQL;

使用注意事项:

  • 不管是3列还是150列,这个方案都能自动适配,不需要修改代码。
  • 如果你的列名包含特殊字符(比如空格、中文),QUOTENAME(name)会自动给列名加上方括号,避免语法错误。
  • 临时表#tvshows必须在当前会话中存在,否则sys.columns找不到对应的列。

内容的提问来源于stack exchange,提问作者bshelt141

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 06:43:11