微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在整个数据库的表的每一列中查找记录计数不包括空白和空值

如何解决在整个数据库的表的每一列中查找记录计数不包括空白和空值

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

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)

解决方法

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交换列和行,这将为您提供所需的结构。

要获得所有表所需的内容而无需手动操作,您可以使用原始查询(不过只是sys.objectssys.columns的联接)并遍历该查询的结果使用CURSOR。在此循环中,您将生成所有表的查询为字符串或带有一些UNION ALL的一个大查询字符串。然后必须使用EXEC()

执行这些字符串/此字符串

示例:

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

EXEC(@MyQuery)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。