You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求统计指定视图行数的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 04:30:57