求统计指定视图行数的SQL Server自定义函数脚本
统计指定视图行数的SQL Server函数脚本
视图和表的行数统计逻辑存在差异:普通视图属于虚拟表,没有像表那样在sys.partitions中存储预计算的行数,必须实际执行统计操作;而创建了聚集索引的索引视图,则可以像表一样通过系统表快速获取行数。
以下是兼容普通视图与索引视图的标量函数:
ALTER FUNCTION [dbo].[COUNT_ROWS_VIEW](@VIEW_NAME NVARCHAR(100)) RETURNS INT AS BEGIN DECLARE @ROW_COUNT INT = 0; DECLARE @ObjectID INT; DECLARE @IsIndexedView BIT; -- 获取视图对象ID及是否为索引视图 SELECT @ObjectID = v.object_id, @IsIndexedView = CASE WHEN EXISTS ( SELECT 1 FROM sys.indexes i WHERE i.object_id = v.object_id AND i.index_id = 1 ) THEN 1 ELSE 0 END FROM sys.views v WHERE v.name = @VIEW_NAME AND v.is_ms_shipped = 0; IF @IsIndexedView = 1 BEGIN -- 索引视图直接从系统表取行数,逻辑与统计表一致 SELECT @ROW_COUNT = SUM(p.rows) FROM sys.partitions p WHERE p.object_id = @ObjectID AND p.index_id IN (1, 0); END ELSE BEGIN -- 普通视图通过动态SQL执行COUNT(*)统计行数 DECLARE @SQL NVARCHAR(MAX); SET @SQL = N'SELECT @RowCountOut = COUNT(*) FROM ' + QUOTENAME(@VIEW_NAME); EXEC sp_executesql @SQL, N'@RowCountOut INT OUTPUT', @RowCountOut = @ROW_COUNT OUTPUT; END RETURN @ROW_COUNT; END
关键说明
- 索引视图优化:针对带聚集索引的视图,复用统计表的高效逻辑,无需全量扫描数据。
- 普通视图处理:通过动态SQL执行
COUNT(*),这是普通视图唯一可行的行数统计方式,效率取决于视图复杂度和底层表数据量。 - 安全防护:使用
QUOTENAME函数避免SQL注入风险,确保视图名称的合法性。
使用示例
-- 统计名为MyBusinessView的视图行数 SELECT dbo.COUNT_ROWS_VIEW('MyBusinessView');
内容的提问来源于stack exchange,提问作者CTA Programmer
相关产品推荐
相关产品推荐

