おそらく最も効率的なオプションは次のとおりです。
SELECT c.name
FROM dbo.CoreTables AS c
WHERE EXISTS
(
SELECT 1
FROM sys.partitions
WHERE index_id IN (0,1)
AND rows > 0
AND [object_id] = OBJECT_ID(c.name)
);
sys.sysindexes、sys.partitions、およびsys.dm_db_partition_statsのカウントは、処理中のトランザクションのために完全に同期することが保証されていないことに注意してください。
このクエリはデータベースのコンテキストで実行できますが、別のデータベースに対して次のように実行できます(ここでも、CoreTablesの名前にスキーマが含まれていないと想定しています)。
SELECT c.name
FROM DatabaseA.CoreTables AS c
WHERE EXISTS
(
SELECT 1
FROM DatabaseB.sys.partitions AS p
INNER JOIN DatabaseB.sys.tables AS t
ON p.[object_id] = t.object_id
WHERE t.name = c.name
AND p.rows > 0
);
すべて同じスキーマ(または少なくとも中央のCoreTablesテーブルに集約してキャプチャしている重複スキーマ)を含む複数のデータベースに対してこれを行う必要がある場合は、次のようなビューを作成することをお勧めします。
CREATE VIEW dbo.CoreTableCounts
AS
SELECT db = 'DatabaseB', t.name, MAX(p.rows)
FROM DatabaseB.sys.partitions AS p
INNER JOIN DatabaseB.sys.tables AS t
ON p.[object_id] = t.[object_id]
INNER JOIN DatabaseA.dbo.CoreTables AS ct
ON t.name = ct.name
WHERE p.index_id IN (0,1)
GROUP BY t.name
UNION ALL
SELECT db = 'DatabaseC', t.name, rows = MAX(p.rows)
FROM DatabaseC.sys.partitions AS p
INNER JOIN DatabaseC.sys.tables AS t
ON p.[object_id] = t.[object_id]
INNER JOIN DatabaseA.dbo.CoreTables AS ct
ON t.name = ct.name
WHERE p.index_id IN (0,1)
GROUP BY t.name
-- ...
GO
これで、クエリはそれほど効率的になりませんが、データベース名をオブジェクトプレフィックスとしてハードコーディングする必要はありません。代わりに、次のようにすることができます。
SELECT name
FROM dbo.CoreTableCounts
WHERE db = 'DatabaseB'
AND rows > 0;
それを実行するのが面倒な場合は、代わりにデータベースごとにビューを作成できます。