【问题标题】:Find the record count in each column (exclude blank and null values) of table in entire database查找整个数据库中表的每一列(不包括空白和空值)中的记录数
【发布时间】:2020-09-22 09:33:13
【问题描述】:

我想找到整个数据库中所有表的每一列的记录数。该计数必须排除该列的空行和空白行。我尝试了以下代码,但它显示了该表的行数。

select
    db_name() DatabaseName, 
    s.name + '.' + o.name TableName, c.name ColumnName, sum(p.rows) RecordCount
    from sys.indexes i inner join sys.partitions p
        on i.[object_id] = p.[object_id] and i.index_id = p.index_id
    inner join sys.objects o
        on o.[object_id] = i.[object_id]
    inner join sys.columns c
        on o.[object_id] = c.[object_id]
    inner join sys.schemas s
        on o.[schema_id] = s.[schema_id] 
    where i.index_id < 2
        --and s.name in ('dbo', 'your_other_schema')
        and o.type = 'U'
    group by s.name, o.name , c.name
    order by s.name, o.name;

代码输出。

https://i.stack.imgur.com/kNNRZ.png

列 system_id 有 5767 行计数,而 objectstate 只有 2589 行计数(不包括空白和空值)

所以我希望 OBJECTSTATE 列数为 2589,SYSTEM_ID 数为 5767

输出喜欢

Table                Column          Count
Table1               Column1         50  (excluding null and blank row)
Table1               Column2         45  (excluding null and blank row)
Table2               Column1         100 (excluding null and blank row)
Table2               column2         69  (excluding null and blank row)

【问题讨论】:

    标签: sql-server rowcount col


    【解决方案1】:

    如记录的heresys.partitions.rows“表示此分区中的近似行数。”

    sys.partitions 加入sys.objectssys.columns 并没有帮助,因为您仍然只有分区级别的rows

    也就是说,您正在查询数据库的元数据。这样做,您无法获得所需的计数。

    您需要做的是对每个表执行查询以获取表列的计数。对一个特定表(例如Table1)执行此操作的查询可能是:

    SELECT 
       -- col1 would be a string (varchar, char, etc.) column
       count(nullif(col1, '')) as col1_count,
       -- col2 would not be a string column
       count(col2) as col2_count
    FROM Table1
    

    上面的查询为您提供了一个结果集,其中每个原始列包含一个列和一个包含计数的单行。您可以更改查询以使用 PIVOT 交换列和行,这将为您提供所需的结构。

    要在不进行手动操作的情况下获得 all 表所需的内容,您可以使用原始查询(尽管只是 sys.objectssys.columns 的连接)并使用循环遍历该查询的结果CURSOR。在此循环中,您将为所有表生成查询作为字符串或带有一些UNION ALL 的大查询字符串。然后必须使用EXEC() 执行这些字符串/此字符串

    例子:

    DECLARE @MyQuery NVARCHAR(MAX)
    SET @MyQuery = 'SELECT ... FROM Table1 UNION ALL SELECT ... FORM Table2 ...'
    
    EXEC(@MyQuery)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-08
      • 1970-01-01
      • 1970-01-01
      • 2019-02-25
      • 1970-01-01
      相关资源
      最近更新 更多