特定のデータベースのいずれかのテーブルにデータ (つまり、行数) があるかどうかを判断するために使用できる SQL スクリプトを探しています。
アイデアは、(データベースのいずれかに) 行が存在する場合にデータベースを再生成することです。
話されているデータベースは ですMicrosoft 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 ごとにこれを試してください。
sysindexes を使用した行数 SQL 2000 を使用している場合は、次のように sysindexes を使用する必要があります。
-- 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 は、SQL Server の将来のバージョンで sysindexes が削除される可能性があるため、次のように代わりに 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, s.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%'
AND s.index_id IN (0,1)
これは私が思う他のものよりもよく見えます。
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 以降では、テーブル サイズ (行数などを含む) を示す非常に優れたレポートが提供されます。これは標準レポートにあり、テーブルごとのディスク使用量です。
プログラム的には、 http ://www.sqlservercentral.com/articles/T-SQL/67624/ に優れたソリューションがあります。
SELECT COUNT(*) FROM TABLENAMEはリソースを集中的に使用する操作であるため、使用しないでください。データベース内のすべてのテーブルの行数情報を取得するには、SQL Server 動的管理ビューまたはシステム カタログを使用する必要があります。
フレデリクのソリューションに小さな変更を加えます。データとインデックスサイズも含まれるsp_spaceusedシステムストアドプロシージャを使用します。
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)
必要に応じて、これをインスタンス内のすべてのデータベースで実行するように拡張するのは簡単です ( に結合しますsys.databases)。
information_schema.tables ビューからすべての行を選択し、そのビューから返された各エントリに対して 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
これはSQL2008の私のお気に入りのソリューションであり、結果を「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%')