当前位置: 首页 > news >正文

Azure Synapse Dedicated SQL Pool统计指定表中各字段的空值、空字符串或零值比例

-- 创建临时表存储结果
CREATE TABLE #Results (
    DatabaseName NVARCHAR(128),
    TableName NVARCHAR(128),
    ColumnName NVARCHAR(128),
    DataType NVARCHAR(128),
    NullOrEmptyCount INT,
    TotalRows INT,
    Percentage DECIMAL(10,2)
);

DECLARE @db_name SYSNAME = DB_NAME();  -- 获取当前数据库名
DECLARE @table_name SYSNAME;
DECLARE @column_name SYSNAME;
DECLARE @data_type SYSNAME;
DECLARE @sql NVARCHAR(MAX);

-- 定义表游标
DECLARE table_cursor CURSOR FOR
SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_TYPE = 'BASE TABLE' 
  AND TABLE_CATALOG = @db_name;

OPEN table_cursor;

FETCH NEXT FROM table_cursor INTO @table_name;

WHILE @@FETCH_STATUS = 0
BEGIN
    -- 定义列游标
    DECLARE column_cursor CURSOR FOR
    SELECT COLUMN_NAME, DATA_TYPE 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = @table_name 
      AND TABLE_CATALOG = @db_name;

    OPEN column_cursor;
    FETCH NEXT FROM column_cursor INTO @column_name, @data_type;

    WHILE @@FETCH_STATUS = 0
    BEGIN
        -- 构建动态SQL
        SET @sql = N'
        INSERT INTO #Results
        SELECT 
            ''' + @db_name + ''' AS DatabaseName,
            ''' + @table_name + ''' AS TableName,
            ''' + @column_name + ''' AS ColumnName,
            ''' + @data_type + ''' AS DataType,
            ';

        -- 根据数据类型处理逻辑
        IF @data_type IN ('varchar', 'nvarchar', 'char', 'nchar', 'text')
        BEGIN
            SET @sql += N'
            SUM(CASE WHEN ISNULL(TRIM([' + @column_name + ']), '''') = '''' THEN 1 ELSE 0 END),';
        END
        ELSE IF @data_type IN ('int', 'bigint', 'smallint', 'tinyint', 'decimal', 'numeric', 'float', 'real')
        BEGIN
            SET @sql += N'
            SUM(CASE WHEN ISNULL([' + @column_name + '], 0) = 0 THEN 1 ELSE 0 END),';
        END
        ELSE
        BEGIN
            SET @sql += N'
            SUM(CASE WHEN [' + @column_name + '] IS NULL THEN 1 ELSE 0 END),';
        END

        -- 添加行数和百分比计算
        SET @sql += N'
            COUNT(*) AS TotalRows,
            ROUND(
                (SUM(CASE WHEN ';
        
        IF @data_type IN ('varchar', 'nvarchar', 'char', 'nchar', 'text')
            SET @sql += N'ISNULL(TRIM([' + @column_name + ']), '''') = '''' '
        ELSE IF @data_type IN ('int', 'bigint', 'smallint', 'tinyint', 'decimal', 'numeric', 'float', 'real')
            SET @sql += N'ISNULL([' + @column_name + '], 0) = 0 '
        ELSE
            SET @sql += N'[' + @column_name + '] IS NULL ';

        SET @sql += N'THEN 1 ELSE 0 END) * 100.0) / 
                NULLIF(COUNT(*), 0), 
                2
            )
        FROM ' + QUOTENAME(@table_name) + ';';

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

        FETCH NEXT FROM column_cursor INTO @column_name, @data_type;
    END

    CLOSE column_cursor;
    DEALLOCATE column_cursor;

    FETCH NEXT FROM table_cursor INTO @table_name;
END

CLOSE table_cursor;
DEALLOCATE table_cursor;

-- 查询最终结果
SELECT 
    DatabaseName,
    TableName,
    ColumnName,
    DataType,
    NullOrEmptyCount,
    TotalRows,
    Percentage
FROM #Results
ORDER BY TableName, ColumnName;

-- 清理临时表
DROP TABLE #Results;

代码说明:

  1. 临时表创建:使用#Results临时表存储最终结果集

  2. 游标遍历

    • 外层游标遍历所有用户表
    • 内层游标遍历每个表的所有列
  3. 动态SQL构建

    • 根据列数据类型生成不同的统计逻辑
    • 字符串类型:使用TRIM()和空字符串判断
    • 数值类型:使用0值判断
    • 其他类型:直接判断NULL值
  4. 安全处理

    • 使用QUOTENAME()防止SQL注入
    • 使用NULLIF()处理除零错误
  5. 结果输出

    • 包含数据库名、表名、列名、数据类型
    • 统计空值/空字符串数量
    • 显示总行数和百分比

执行结果示例:

DatabaseNameTableNameColumnNameDataTypeNullOrEmptyCountTotalRowsPercentage
MyDBCustomerFirstNamevarchar125100001.25
MyDBCustomerAgeint23001000023.00
MyDBOrderOrderDatedatetime4550000.90

注意事项:

  1. 需要具有访问系统视图的权限
  2. 对大型表执行COUNT(*)可能影响性能
  3. 确保在正确的数据库上下文中执行
  4. 结果百分比保留两位小数
  5. 处理text类型字段时可能需要考虑性能影响
http://www.dtcms.com/a/23894.html

相关文章:

  • 什么是 近端策略优化算法PPO
  • 【动态规划】(二)动态规划——0-1背包问题
  • 第35次CCF计算机软件能力认证 python 参考代码
  • RK3588 ubuntu20.04 换源 aarch64源
  • redis数据类型
  • WebAssembly 3.0发布:浏览器端高性能计算迎来新突破!
  • DFS算法篇:理解递归,熟悉递归,成为递归
  • huggingface/pytorch-image-models
  • java实现不带哨兵节点的双向链表(二)
  • 力扣-二叉树-112 路径总和
  • 【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十一节】
  • 简单介绍输入URL到展出页面的过程
  • 【亚马逊开发者账号02】终审问题SA+review_Pre-review+Doc.xlsx
  • 【Linux线程】阻塞队列环形队列(消费者生产者模型的实现)
  • Python常见面试题的详解5
  • AI 项目开发流程
  • 硅基流动+OfficeAI:开启WPS智能办公新时代
  • 【MATLAB】解决mod函数、逻辑判断的误差问题
  • 说一下Redis中的Gossip协议
  • 机器学习_16 朴素贝叶斯知识点总结
  • Unreal5从入门到精通之使用 BindWidget 将 C++ 连接到 UMG 蓝图
  • nginx部署vue项目访问路径问题
  • MATLAB联动本地部署的DeepSeek模型
  • JAX-RS与JAXB:实现XML数据交互的完整指南
  • 基于MATLAB的城轨车辆跨接电缆长度计算
  • 青少年编程与数学 02-009 Django 5 Web 编程 20课题、测试
  • 68页PDF | 数据安全总体解决方案:从数据管理方法论到落地实践的全方位指南(附下载)
  • 编码格式大全:类型 特点及其在网络安全中的作用
  • STM32 PWM脉冲宽度调制介绍
  • python股票分析系统部署操作过程及代码实现