SQL SERVER 데이터베이스의 모든 테이블에 대한 행 수를 가져오는 방법
특정 데이터베이스의 테이블에 데이터(행 수 등)가 있는지 확인하기 위해 사용할 수 있는 SQL 스크립트를 검색하고 있습니다.
즉, (데이터베이스 중 하나에) 행이 존재하는 경우 데이터베이스를 다시 통합하는 것입니다.
거론되고 있는 데이터베이스는Microsoft SQL SERVER
.
누가 샘플 대본 좀 제안해 주시겠어요?
다음 SQL은 데이터베이스 내의 모든 테이블의 행 수를 가져옵니다.
CREATE TABLE #counts
(
table_name varchar(255),
row_count int
)
EXEC sp_MSForEachTable @command1='INSERT #counts (table_name, row_count) SELECT ''?'', COUNT(*) FROM ?'
SELECT table_name, row_count FROM #counts ORDER BY table_name, row_count DESC
DROP TABLE #counts
출력은 테이블과 그 행 수 리스트가 됩니다.
데이터베이스 전체에서 행의 합계수를 구하는 경우는, 다음과 같이 추가합니다.
SELECT SUM(row_count) AS total_row_count FROM #counts
그러면 전체 데이터베이스의 총 행 수에 대한 단일 값이 표시됩니다.
300만 개의 행 테이블을 세는 데 걸리는 시간과 자원을 넘길 필요가 있습니다(*).이것은 Kendal Van Dyke의 SQL SERVER Central별로 시험해 보십시오.
행 수 sysindex를 사용하는 SQL 2000을 사용하는 경우 다음과 같은 sysindex를 사용해야 합니다.
-- Shows all user tables and row counts for the current database
-- Remove OBJECTPROPERTY function call to include system objects
SELECT o.NAME,
i.rowcnt
FROM sysindexes AS i
INNER JOIN sysobjects AS o ON i.id = o.id
WHERE i.indid < 2 AND OBJECTPROPERTY(o.id, 'IsMSShipped') = 0
ORDER BY o.NAME
SQL 2005 또는 2008을 사용하는 경우 sysindexes 쿼리는 계속 기능하지만 Microsoft는 sysindexes가 향후 버전의 SQL Server에서 삭제될 수 있으므로 다음과 같이 DMV를 사용하는 것이 좋습니다.
-- Shows all user tables and row counts for the current database
-- Remove is_ms_shipped = 0 check to include system objects
-- i.index_id < 2 indicates clustered index (1) or hash table (0)
SELECT o.name,
ddps.row_count
FROM sys.indexes AS i
INNER JOIN sys.objects AS o ON i.OBJECT_ID = o.OBJECT_ID
INNER JOIN sys.dm_db_partition_stats AS ddps ON i.OBJECT_ID = ddps.OBJECT_ID
AND i.index_id = ddps.index_id
WHERE i.index_id < 2 AND o.is_ms_shipped = 0 ORDER BY o.NAME
Azure에서 작동하며 저장된 프로세서가 필요하지 않습니다.
SELECT t.name AS table_name
,s.row_count AS row_count
FROM sys.tables t
JOIN sys.dm_db_partition_stats s
ON t.OBJECT_ID = s.OBJECT_ID
AND t.type_desc = 'USER_TABLE'
AND t.name NOT LIKE '%dss%' --Exclude tables created by SQL Data Sync for Azure.
AND s.index_id IN (0, 1)
ORDER BY table_name;
신용.
이건 내가 생각하는 다른 것보다 더 좋아 보인다.
USE [enter your db name here]
GO
SELECT SCHEMA_NAME(A.schema_id) + '.' +
--A.Name, SUM(B.rows) AS 'RowCount' Use AVG instead of SUM
A.Name, AVG(B.rows) AS 'RowCount'
FROM sys.objects A
INNER JOIN sys.partitions B ON A.object_id = B.object_id
WHERE A.type = 'U'
GROUP BY A.schema_id, A.Name
GO
짧고 달콤한
sp_MSForEachTable 'DECLARE @t AS VARCHAR(MAX);
SELECT @t = CAST(COUNT(1) as VARCHAR(MAX))
+ CHAR(9) + CHAR(9) + ''?'' FROM ? ; PRINT @t'
출력:
SELECT
sc.name +'.'+ ta.name TableName, SUM(pa.rows) RowCnt
FROM
sys.tables ta
INNER JOIN sys.partitions pa
ON pa.OBJECT_ID = ta.OBJECT_ID
INNER JOIN sys.schemas sc
ON ta.schema_id = sc.schema_id
WHERE ta.is_ms_shipped = 0 AND pa.index_id IN (1,0)
GROUP BY sc.name,ta.name
ORDER BY SUM(pa.rows) DESC
SQL Server 2005 이후에서는 행 수 등 테이블 크기를 보여주는 매우 좋은 보고서가 제공됩니다.Standard Reports(표준 보고서)에 기재되어 있습니다.또, 「Disc Usage by Table(테이블별 디스크 사용 상황)」이라고 기재되어 있습니다.
프로그램적으로는 http://www.sqlservercentral.com/articles/T-SQL/67624/에 좋은 솔루션이 있습니다.
사용하지 않다SELECT COUNT(*) FROM TABLENAME
자원 부하가 높은 작업이기 때문입니다.데이터베이스 내의 모든 테이블의 행 수 정보를 가져오려면 SQL Server 동적 관리 보기 또는 시스템 카탈로그를 사용해야 합니다.
프레데릭의 해결책에 작은 변화를 줄 거야sp_spaceused system stored procedure를 사용합니다.이 프로시저는 데이터와 인덱스 사이즈도 포함합니다.
declare c_tables cursor fast_forward for
select table_name from information_schema.tables
open c_tables
declare @tablename varchar(255)
declare @stmt nvarchar(2000)
declare @rowcount int
fetch next from c_tables into @tablename
while @@fetch_status = 0
begin
select @stmt = 'sp_spaceused ' + @tablename
exec sp_executesql @stmt
fetch next from c_tables into @tablename
end
close c_tables
deallocate c_tables
다음은 스키마도 제공하는 동적 SQL 접근법입니다.
DECLARE @sql nvarchar(MAX)
SELECT
@sql = COALESCE(@sql + ' UNION ALL ', '') +
'SELECT
''' + s.name + ''' AS ''Schema'',
''' + t.name + ''' AS ''Table'',
COUNT(*) AS Count
FROM ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name)
FROM sys.schemas s
INNER JOIN sys.tables t ON t.schema_id = s.schema_id
ORDER BY
s.name,
t.name
EXEC(@sql)
경우 내의 inin in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in)로 일입니다.sys.databases
를 참조해 주세요.
information_syslog.syslog 뷰에서 모든 행을 선택하고 해당 뷰에서 반환된 각 엔트리에 대해 count) 문을 발행합니다.
declare c_tables cursor fast_forward for
select table_name from information_schema.tables
open c_tables
declare @tablename varchar(255)
declare @stmt nvarchar(2000)
declare @rowcount int
fetch next from c_tables into @tablename
while @@fetch_status = 0
begin
select @stmt = 'select @rowcount = count(*) from ' + @tablename
exec sp_executesql @stmt, N'@rowcount int output', @rowcount=@rowcount OUTPUT
print N'table: ' + @tablename + ' has ' + convert(nvarchar(1000),@rowcount) + ' rows'
fetch next from c_tables into @tablename
end
close c_tables
deallocate c_tables
이것은 SQL 2008에서 가장 마음에 드는 솔루션입니다.이 솔루션은 결과를 "TEST" 임시 테이블로 정리하여 필요한 결과를 얻을 수 있습니다.
SET NOCOUNT ON
DBCC UPDATEUSAGE(0)
DROP TABLE #t;
CREATE TABLE #t
(
[name] NVARCHAR(128),
[rows] CHAR(11),
reserved VARCHAR(18),
data VARCHAR(18),
index_size VARCHAR(18),
unused VARCHAR(18)
) ;
INSERT #t EXEC sp_msForEachTable 'EXEC sp_spaceused ''?'''
SELECT * INTO TEST FROM #t;
DROP TABLE #t;
SELECT name, [rows], reserved, data, index_size, unused FROM TEST \
WHERE ([rows] > 0) AND (name LIKE 'XXX%')
SELECT
SUM(sdmvPTNS.row_count) AS [DBRows]
FROM
sys.objects AS sOBJ
INNER JOIN sys.dm_db_partition_stats AS sdmvPTNS
ON sOBJ.object_id = sdmvPTNS.object_id
WHERE
sOBJ.type = 'U'
AND sOBJ.is_ms_shipped = 0
AND sdmvPTNS.index_id < 2
GO
언급URL : https://stackoverflow.com/questions/2221555/how-to-fetch-the-row-count-for-all-tables-in-a-sql-server-database
'programing' 카테고리의 다른 글
Visual Studio에서 다음 오류 바로 가기로 이동하시겠습니까? (0) | 2023.04.18 |
---|---|
bash 스크립트에서 ENTER 키 프레스를 시뮬레이션하는 중 (0) | 2023.04.18 |
목적에서 예외를 두는 것 (0) | 2023.04.13 |
특정 태그를 가진 도커 이미지가 로컬에 존재하는지 확인하는 방법 (0) | 2023.04.13 |
Visual Studio 2017 - 표현 상호작용은 어떻게 되었습니까? (0) | 2023.04.13 |