2012-01-10 20 views
2

私はデータベースのすべてのビューとテーブルの行数を取得するカスタマイズされたビューを作成しようとしています。テーブルの数を取得データベースからビューの行数を取得する方法は?

は今、私はVIEWS

のための行数を取得する必要があり、私は唯一の方法は、ビューからの行数を数えることであると感じ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

ただし、view_name、table_schemaなどのビューにrowcountを設定する方法が見つかりませんでした。

これ以上の進歩は役に立ちます。

+1

インデックスされたビューまたはすべてのビューについて話していますか? –

+0

すべてのビュー.... @マーティンスミス – user1141584

+0

'SELECT COUNT(*)...'が唯一の方法です。 –

答えて

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でこれを実行すると表示できるようにしました。結果をテーブルなどに挿入することをお勧めします。そうであれば、動的クエリを選択から挿入に変更するだけです。さらに別れなしだから、

ここ
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

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歳近くであり、答えが受け入れられていることを考えれば、すでに与えられた質問に対する答えがどのように改善するかを説明する必要があります。 –

関連する問題