293

特定のデータベースのいずれかのテーブルにデータ (つまり、行数) があるかどうかを判断するために使用できる SQL スクリプトを探しています。

アイデアは、(データベースのいずれかに) 行が存在する場合にデータベースを再生成することです。

話されているデータベースは ですMicrosoft SQL SERVER

誰かがサンプル スクリプトを提案できますか?

4

13 に答える 13

444

次の 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

データベース全体の合計行数の単一の値を取得します。

于 2010-02-08T13:38:42.140 に答える
227

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 
于 2010-05-14T18:55:53.467 に答える
122

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)

クレジット

于 2014-06-09T11:23:11.910 に答える
65

これは私が思う他のものよりもよく見えます。

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
于 2013-03-19T10:37:16.823 に答える
26

短くて甘い

sp_MSForEachTable 'DECLARE @t AS VARCHAR(MAX); 
SELECT @t = CAST(COUNT(1) as VARCHAR(MAX)) 
+ CHAR(9) + CHAR(9) + ''?'' FROM ? ; PRINT @t'

出力:

ここに画像の説明を入力

于 2013-10-28T10:36:16.317 に答える
16
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
于 2013-10-28T09:24:27.513 に答える
15

SQL Server 2005 以降では、テーブル サイズ (行数などを含む) を示す非常に優れたレポートが提供されます。これは標準レポートにあり、テーブルごとのディスク使用量です。

プログラム的には、 http ://www.sqlservercentral.com/articles/T-SQL/67624/ に優れたソリューションがあります。

于 2010-02-08T12:40:43.827 に答える
9

SELECT COUNT(*) FROM TABLENAMEはリソースを集中的に使用する操作であるため、使用しないでください。データベース内のすべてのテーブルの行数情報を取得するには、SQL Server 動的管理ビューまたはシステム カタログを使用する必要があります。

于 2011-11-15T08:20:48.297 に答える
3

フレデリクのソリューションに小さな変更を加えます。データとインデックスサイズも含まれる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 

于 2010-02-08T16:05:54.777 に答える
3

これは、スキーマも提供する動的 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)。

于 2011-07-12T14:03:28.063 に答える
2

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
于 2010-02-08T12:42:27.887 に答える
1

これは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%')
于 2011-10-31T16:54:56.893 に答える