Как получить количество строк для представлений из базы данных? - PullRequest
2 голосов
/ 10 января 2012

Я пытаюсь создать настраиваемое представление, которое подсчитывает количество строк для всех представлений и таблиц базы данных.

Черт возьми, что подсчет таблицы в 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 и т. Д.

Любое продвижение по этому вопросу было бы полезно.

Ответы [ 4 ]

0 голосов
/ 30 октября 2016
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
0 голосов
/ 15 февраля 2012

Вот окончательное решение:

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
0 голосов
/ 06 мая 2013

Я знаю, что это старый пост, и я не собираюсь брать кредит от отмеченного ответа, но хотел добавить к нему.

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

Я добавил имя просмотра, чтобы помочь различать цифры больше.

0 голосов
/ 25 января 2012

Ну, это не очень красиво, но это должно сработать.

Это относится к одной базе данных, потому что я использую системное представление '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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...