我需要知道第三方数据库中每个视图的行数,我被授予仅 SELECT 访问权限。以下脚本适用于表,但不适用于视图:
SELECT SCHEMA_NAME(A.schema_id) + '.' +
--A.Name, SUM(B.rows) AS 'RowCount' Use AVG instead of SUM
A.Name, AVG(B.rows) AS 'RowCount'
FROM sys.objects A
INNER JOIN sys.partitions B ON A.object_id = B.object_id
WHERE A.type = 'U'
GROUP BY A.schema_id, A.Name
Order by AVG(B.rows) desc
GO
我在网上查看过,但所有建议要么仅适用于表格,要么要求我创建表格或过程(我无法使用此级别的权限),要么要求我分别计算每个视图的行数,这是不可行的对于包含大量此类视图的数据库。
有没有人对一个脚本有任何想法,它可以计算数据库中所有视图中的所有行,而不需要 CREATE 或 EXECUTE 权限?
一些改进。
QUOTENAME()
挫败坏名声sys.views
代替sys.objects
(并type
从输出中删除)sys.partitions
为index_id
0 或 1,以防止在带有其他非聚集索引的索引视图的情况下重复计数(不确定您认为AVG
会完成什么 - 如果有一个带有非聚集过滤索引的索引视图怎么办?使用动态 SQL 避免手动复制/手动粘贴/手动按摩/手动运行
请注意,
FromMetadata
除非视图被索引,否则它将为 0。虽然它不是单个脚本,但 Andrey Nikolov 在这里描述的方法似乎有效:
https://stackoverflow.com/questions/53263435/how-do-i-get-the-list-of-all-views-present-in-a-database-and-its-record-count
使用仅返回视图而不返回表的脚本版本:
然后复制并运行最后一列的结果,并删除最终的 UNION ALL。
(尽管在我的例子中,我必须通过添加方括号和模式名称来更改通过复制第一个查询结果的最后一列生成的脚本,因为数据库设计人员已将表命名为“用户”和“案例”。 )
希望这对其他有同样问题的人有用!