如何解决在整个数据库的表的每一列中查找记录计数不包括空白和空值
我想找到整个数据库中所有表的每一列的记录数。计数必须排除该列的空行和空白行。我尝试了以下代码,但它显示了该表的行数。
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)
解决方法
如here,sys.partitions.rows
所述,“表示此分区中的大约行数。”
将sys.partitions
绑定到sys.objects
和sys.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.objects
和sys.columns
的联接)并遍历该查询的结果使用CURSOR
。在此循环中,您将生成所有表的查询为字符串或带有一些UNION ALL
的一个大查询字符串。然后必须使用EXEC()
示例:
DECLARE @MyQuery NVARCHAR(MAX)
SET @MyQuery = 'SELECT ... FROM Table1 UNION ALL SELECT ... FORM Table2 ...'
EXEC(@MyQuery)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。