Как получить количество строк для представлений из базы данных?


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

Получение количества таблиц чертовски в 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  

Теперь мне нужно получить число строк для представлений

Я чувствую, что единственный способ-это подсчитать количество строк из представлений то есть count(*) from view_name

Но, я не мог найти способ иметь rowcount для view наряду с view_name, table_schema и так далее.

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

4 2

4 ответа:

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

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

Я также ограничил представления, для которых я возвращаю графы, с помощью "schema_id". Вы можете посмотреть на это и определить, что будет лучше для вас.

Наконец, я просто выплюнул результаты, чтобы вы могли их просмотреть, если вы запустите это в Management Studio. Вы возможно, вы захотите вставить результаты в таблицу или что-то еще. Если да, то это просто вопрос изменения динамического запроса с select на insert.

Итак, без дальнейших прощаний:

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

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

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

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

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

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

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