Как получить количество строк для представлений из базы данных?
Я пытаюсь создать настраиваемое представление, которое возвращает мне количество строк для всех представлений и таблиц базы данных.
Получение количества таблиц чертовски в 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 ответа:
Ну, это не очень красиво, но это должно сделать трюк.
Это относится к одной базе данных, потому что я использую системное представление "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