2012-01-10 3 views
2

데이터베이스의 모든 뷰와 테이블에 대한 행 수를 사용자 정의 뷰로 만들기 위해 노력하고 있습니다.데이터베이스에서 뷰에 대한 행 수를 얻는 방법은 무엇입니까?

테이블의 수를 얻는 것은 내가

내가 유일한 방법은 뷰에서 행의 수를 계산하는 느낌 뷰에 대한 행 개수를 얻을 필요가,

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 

이제 SQL Server의 저주입니다 예 : count(*) from view_name

그러나 view_name, table_schema 등과 함께보기에 대한 행 개수를 가질 수있는 방법을 찾을 수 없습니다.

이것에 대한 진전이 도움이 될 것입니다.

+1

색인 된보기 또는 모든보기에 대해 이야기하고 있습니까? –

+0

모든보기 .... @Martin Smith – 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 세이며 받아 들인 대답이 주어지면, 이미 주어진 질문에 대한 답이 어떻게 개선되는지 설명해야합니다. –

관련 문제