① 全ユーザーテーブルの正確な件数を取得する(推奨)
SELECT
s.name AS schema_name,
t.name AS table_name,
SUM(p.rows) AS row_count
FROM
sys.tables t
INNER JOIN
sys.schemas s ON t.schema_id = s.schema_id
INNER JOIN
sys.partitions p ON t.object_id = p.object_id
WHERE
p.index_id IN (0,1) -- 0: Heap, 1: Clustered Index
GROUP BY
s.name, t.name
ORDER BY
s.name, t.name;
✔ 特徴
- 全テーブルを一括取得
- スキーマ付きで出力
- パーティションテーブルにも対応
- 実務で最も使われる方法
② シンプルに各テーブルをCOUNT(*)する方法(最も正確)
SELECT COUNT(*) FROM dbo.TableName;
全テーブル分自動生成する場合:
SELECT
'SELECT ''' + s.name + '.' + t.name + ''' AS table_name, COUNT(*) AS row_count FROM ['
+ s.name + '].[' + t.name + '];'
FROM
sys.tables t
JOIN
sys.schemas s ON t.schema_id = s.schema_id
ORDER BY
s.name, t.name;
生成されたSQLを実行すればOKです。
✔ 特徴
- 完全に正確
- ただし大規模DBでは時間がかかる
③ 高速に概算件数を取得(メタデータ参照)
SELECT
OBJECT_SCHEMA_NAME(object_id) AS schema_name,
OBJECT_NAME(object_id) AS table_name,
SUM(row_count) AS row_count
FROM
sys.dm_db_partition_stats
WHERE
index_id IN (0,1)
GROUP BY
object_id
ORDER BY
schema_name, table_name;
✔ 特徴
- 高速
- 大規模DB向け
- 通常は正確だが、統計更新タイミングで差異が出る可能性あり
④ 移行前後比較用フォーマット(おすすめ)
移行前・移行後それぞれでCSV出力してExcel比較が実務では一般的です。
比較しやすい形式:
SELECT
DB_NAME() AS database_name,
s.name AS schema_name,
t.name AS table_name,
SUM(p.rows) AS row_count
FROM
sys.tables t
JOIN
sys.schemas s ON t.schema_id = s.schema_id
JOIN
sys.partitions p ON t.object_id = p.object_id
WHERE
p.index_id IN (0,1)
GROUP BY
s.name, t.name
ORDER BY
s.name, t.name;
⑤ 差分チェック用(リンクサーバー使用例)
SELECT
A.schema_name,
A.table_name,
A.row_count AS before_count,
B.row_count AS after_count,
(B.row_count - A.row_count) AS diff
FROM
BeforeDB.dbo.TableCount A
JOIN
AfterDB.dbo.TableCount B
ON
A.schema_name = B.schema_name
AND A.table_name = B.table_name
ORDER BY
A.schema_name, A.table_name;
実務での使い分け
| 方法 | 精度 | 速度 | 用途 |
|---|---|---|---|
| COUNT(*) | ◎ | △ | 厳密検証 |
| sys.partitions | ◎ | ◎ | 移行検証標準 |
| dm_db_partition_stats | ○ | ◎ | 超大規模DB |
現場でのおすすめ運用
- 移行前に件数取得 → CSV保存
- 移行後に同クエリ実行 → CSV保存
- ExcelやSQLで差分比較
- 差分があるテーブルのみ詳細検証

コメント