【问题标题】:How to get the row count for views from a database?如何从数据库中获取视图的行数?
【发布时间】:2012-01-10 19:24:23
【问题描述】:

我正在尝试制作一个自定义视图,以获取数据库所有视图和表的行数。

在 SQL Server 中获取表的计数是该死的

SELECT TABLE_SCHEMA,
       TABLE_NAME = TABLES.TABLE_NAME,
       RECORD_COUNT = MAX(SYSINDEXES.ROWS)
FROM   SYS.SYSINDEXES "SYSINDEXES",
       INFORMATION_SCHEMA.TABLES "TABLES"
WHERE  TABLES.TABLE_NAME = OBJECT_NAME(SYSINDEXES.ID)
       AND TABLES.TABLE_TYPE = 'BASE TABLE'
GROUP  BY TABLES.TABLE_SCHEMA,
          TABLES.TABLE_NAME  

现在,我需要获取 VIEWS 的行数

我觉得唯一的方法是从视图中计算行数 即count(*) from view_name

但是,我找不到一种方法来获取视图的行数以及 view_name、table_schema 等。

这方面的任何进展都会有所帮助。

【问题讨论】:

  • 你说的是索引视图还是所有视图?
  • 所有观点 .... @Martin Smith
  • SELECT COUNT(*) ... 是唯一的方法。
  • 是的,我就是这么想的,但我怎么能把 TABLE_NAME|TABLE_ROWCOUNT 放在一边……加入他们是不可能的。
  • 不得不删除我的解决方案,这可能会变得丑陋...我会发布另一个解决方案,但如果我自己这么说,那就太可怕了。它的要点是创建一个临时表来存储名称并遍历每个名​​称并为每个视图获取一个 SELECT COUNT(*)。它涉及一些神秘的EXEC 语句,对我来说不是最好的解决方案。正如 fermat 所说,或者接近他所说的,我对这个问题有一个优雅的解决方案——但边距太小,无法展示给你看。在我的情况下,这是同一件事,这个解决方案是肮脏的发布:)。

标签: sql sql-server-2008-r2


【解决方案1】:

嗯,它不是很漂亮,但这应该可以解决问题。

这适用于单个数据库,因为我使用系统视图“all_views”来获取数据。如果你想要别的东西,我相信它可以被改编。

我还通过“schema_id”限制了要返回的视图计数。您可以查看此内容并确定最适合您的方法。

最后,我刚刚将结果吐出,以便您在 Management Studio 中运行时查看它们。您可能希望将结果插入到表格或其他东西中。如果是这样,只需将动态查询从选择更改为插入即可。

那就不用说了:

SET NOCOUNT ON

DECLARE   @ViewName AS nVarChar(128)
        , @Query AS nVarChar(500)

/* Declare Cursor */
DECLARE Cur_Views CURSOR
    FOR
    SELECT  name
        FROM    [sys].[all_views] x
        WHERE   x.schema_id = 1

-- Loop through the views.
OPEN Cur_Views

-- Fetch the first view
FETCH NEXT FROM Cur_Views
    INTO      @ViewName

WHILE   @@Fetch_Status = 0 BEGIN
    -- Set up our dynamic sql
    SELECT  @Query = 'SELECT COUNT(*) AS [Count] FROM ' + @ViewName
    -- Print the query we're executing for debugging purposes
    -- PRINT @Query
    -- Execute the dynamic query
    EXECUTE(@Query)

    -- Fetch subsequent views
    FETCH NEXT FROM Cur_Views
        INTO      @ViewName

-- Loop back to the beginning
END -- WHILE    @@Fetch_Status = 0 BEGIN

-- Close the cursor
CLOSE Cur_Views

-- Dispose of the cursor
DEALLOCATE Cur_Views

GO

【讨论】:

    【解决方案2】:

    这里,是最终的解决方案:

    SET NOCOUNT ON
    DECLARE   @ViewName AS nVarChar(128)
        , @TmpQuery AS nVarChar(500)
        , @Out3 as int
    DECLARE Cur_Views CURSOR FOR
    SELECT schema_name(schema_id)+'.'+name as "Table_Name" FROM [sys].[all_views] 
    OPEN Cur_Views
    FETCH NEXT FROM Cur_Views INTO @ViewName
    WHILE   @@Fetch_Status = 0 BEGIN
    --SELECT  @Query = 'SELECT COUNT(*) AS [Count] FROM ' + @ViewName
    --EXECUTE(@Query)
    CREATE TABLE #Data (var int)
    SELECT  @TmpQuery = 'SELECT COUNT(*) AS [Count] FROM ' + @ViewName
    INSERT #Data exec (@TmpQuery)
    SELECT @Out3 = var from #Data
    --PRINT @ViewName
    --PRINT @Out3
    insert into Person.ViewCountTracker values(@ViewName,@Out3)
    DROP TABLE #Data
    FETCH NEXT FROM Cur_Views INTO @ViewName
    END
    CLOSE Cur_Views
    DEALLOCATE Cur_Views
    GO
    --create table Person.ViewCountTracker
    --(
    --  ViewName varchar(255),
    --  RowValue int
    --)
    --select * from Person.ViewCountTracker
    

    【讨论】:

      【解决方案3】:

      我知道这是一篇旧帖子,我不打算从标记的答案中获得荣誉,但想添加它。

      SELECT  @Query = 'SELECT ''' + @ViewName + ''' AS Name, COUNT(*) AS [Count] FROM ' + @ViewName
      

      我添加了视图名称以帮助区分数字。

      【讨论】:

        【解决方案4】:
        SET NOCOUNT ON
        DECLARE @ViewName AS nVarChar(128), @TmpQuery AS nVarChar(384)
        CREATE TABLE #Results (Name nVarChar(128), Cnt BigInt)
        DECLARE Cur_Views CURSOR FOR SELECT schema_name(schema_id) + '.' + name AS Name FROM [sys].[all_views] WHERE is_ms_shipped = 0
        OPEN Cur_Views
        WHILE  (1=1)
        BEGIN
            FETCH NEXT FROM Cur_Views INTO @ViewName
            If @@Fetch_Status != 0 BREAK
            SELECT  @TmpQuery = 'SELECT ''' + @ViewName + ''' AS Name, COUNT_BIG(*) AS Cnt FROM ' + @ViewName + ' (NoLock)'
            PRINT @TmpQuery
            INSERT #Results EXEC (@TmpQuery)
        END
        CLOSE Cur_Views
        DEALLOCATE Cur_Views
        SET NOCOUNT OFF
        SELECT * FROM #Results
        DROP TABLE #Results
        GO
        

        【讨论】:

        • 请不要发布纯代码答案。解释你的答案如何解决 OPs 问题。鉴于最初的问题已经有将近 5 年的历史了并且有一个公认的答案,您应该说明您的答案如何改进已经给出的答案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-22
        相关资源
        最近更新 更多