2012-01-10 30 views
2

我試圖做一個自定義的視圖,讓我的數據庫的所有視圖和表的行數。如何從數據庫中獲取視圖的行數?

獲取數據表的計數是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行數

我覺得唯一的辦法就是計算行從視圖數 ie count(*) from view_name

但是,我無法找到一種方法來獲得與view_name,table_schema等視圖的行數。

對此有任何進展都會有所幫助。

+1

你是在談論索引視圖還是所有視圖? – 2012-01-10 19:27:25

+0

所有的意見.... @馬丁史密斯 – user1141584 2012-01-10 19:38:24

+0

'選擇計數(*)...'是唯一的方法。 – 2012-01-10 19:39:15

回答

0

這裏,是最終的解決方案:

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

嗯,它不是很漂亮,但這應該做的伎倆。

這適用於單個數據庫,因爲我使用系統視圖'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 
+0

非常感謝,您的想法爲我工作。 – user1141584 2012-02-15 04:10:14

0

我知道這是舊的文章,我不打算採取信貸從明顯的答案,但想添加到它。

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

我添加了視圖名稱以幫助區分更多的數字。

0
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 
+1

請不要發佈代碼的答案。解釋你的答案如何解決OP問題。鑑於最初的問題已接近5年,並且有一個可接受的答案,您應該解釋您的答案如何改進已有的答案。 – 2016-10-30 01:53:50

相關問題