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

SQL Server 2016:如何用动态SQL实现多列数据类型与空值统计?

问题分析

你需要针对Data表的每一列,统计三类数据:NULL的数量(Blank)、单一类型(纯字母/纯数字)的数量(Count_Pat_1)、混合类型(字母+数字)的数量(Count_Pat_2),并且输出成指定的表格格式。之前尝试把静态统计逻辑直接嵌入动态SQL的CASE里导致出错,核心是需要把每列的统计逻辑独立处理后再聚合拼接。

解决方案代码
DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql = @sql + 
CASE WHEN @sql <> N'' THEN N'UNION ALL ' ELSE N'' END +
N'
SELECT 
    ''' + c.name + ''' AS Col_name,
    SUM(CASE 
        WHEN ' + QUOTENAME(c.name) + ' IS NULL THEN 0
        WHEN PATINDEX(''%A%'', Pattern) > 0 AND PATINDEX(''%N%'', Pattern) = 0 THEN 1
        WHEN PATINDEX(''%N%'', Pattern) > 0 AND PATINDEX(''%A%'', Pattern) = 0 THEN 1
        ELSE 0
    END) AS Count_Pat_1,
    SUM(CASE 
        WHEN ' + QUOTENAME(c.name) + ' IS NULL THEN 0
        WHEN PATINDEX(''%A%'', Pattern) > 0 AND PATINDEX(''%N%'', Pattern) > 0 THEN 1
        ELSE 0
    END) AS Count_Pat_2,
    SUM(CASE WHEN ' + QUOTENAME(c.name) + ' IS NULL THEN 1 ELSE 0 END) AS Blank
FROM (
    SELECT 
        REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
        REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
        REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
        REPLACE(REPLACE(REPLACE(REPLACE(UPPER(LTRIM(RTRIM(' + QUOTENAME(c.name) + ')))),
        ''A'',''A''),''B'',''A''),''C'',''A''),''D'',''A''),''E'',''A''),''F'',''A''),''G'',''A''),''H'',''A''),''I'',''A''),''J'',''A''),
        ''K'',''A''),''L'',''A''),''M'',''A''),''N'',''A''),''O'',''A''),''P'',''A''),''Q'',''A''),''R'',''A''),''S'',''A''),''T'',''A''),
        ''U'',''A''),''V'',''A''),''W'',''A''),''X'',''A''),''Y'',''A''),''Z'',''A''),''0'',''N''),''1'',''N''),''2'',''N''),''3'',''N''),
        ''4'',''N''),''5'',''N''),''6'',''N''),''7'',''N''),''8'',''N''),''9'',''N'') AS Pattern
    FROM Data
) AS SubQuery
'
FROM sys.columns c
JOIN sys.tables t ON c.object_id = t.object_id
WHERE t.name = 'Data';

EXEC sp_executesql @sql;
代码说明
  1. 动态SQL拼接逻辑:遍历Data表的所有列,为每一列生成独立的统计查询语句,用UNION ALL把所有列的结果拼接成最终的表格,每行对应一个列的统计数据。
  2. 字段预处理:先用LTRIM(RTRIM())去除字段首尾空格(匹配你示例中Column4的带空格数据),再转成大写,确保字母统一处理。
  3. 字符替换逻辑:和你原有的静态SQL一致,把所有字母替换成A,所有数字替换成N,得到每个值的Pattern字符串。
  4. 类型判断:
    • 用PATINDEX('%A%', Pattern)检查是否包含字母标识,PATINDEX('%N%', Pattern)检查是否包含数字标识;
    • 只有A或只有N → 计入Count_Pat_1;
    • 同时有A和N → 计入Count_Pat_2;
    • NULL值单独统计到Blank。
  5. 聚合统计:用SUM函数统计每类的数量,得到每列的最终统计结果。
测试结果

运行上述代码后,针对你提供的示例数据,会输出你想要的表格:

Col_nameCount_Pat_1Count_Pat_2Blank
Column1101
Column2002
Column3020
Column4110

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 12:22:53