SQL Serverでは、次のいずれもないすべてのテーブルをどのように検索しますか。
SwapnilBhateの回答 は、外部キーによって参照されるテーブルを返します。さらにLEFT JOIN
はこれらを除外します:
SELECT tbl.name
FROM sys.tables AS tbl
LEFT JOIN sys.foreign_key_columns AS fKey
ON tbl.object_id = fKey.parent_object_id
LEFT JOIN sys.foreign_key_columns AS rKey
ON tbl.object_id = rKey.referenced_object_id
WHERE fKey.parent_object_id IS NULL
AND rKey.referenced_object_id IS NULL;
sp_fkeys
プロシージャを使用して、論理外部キー情報を取得できます。ただし、実行する必要がある制限は、入力パラメーターとしてテーブル名を渡すことです。同じことに関する詳細情報は、MSDNライブラリの下にあります。
または、以下のクエリを使用してsys.tablesからすべてのテーブルを取得し、同じテーブルobject_idがsys.foreign_key_columnsに存在するかどうかを確認できます。
SELECT tbl.name
FROM sys.tables AS tbl
LEFT JOIN sys.foreign_key_columns AS fKey
ON tbl.object_id = fKey.parent_object_id
WHERE fKey.parent_object_id IS NULL
完全を期すために、sys.foreign_key_columnsの代わりにsys.foreign_keysをクエリして、参照されておらず、他を参照していないテーブルを見つけることもできます。
SELECT
schema_name = s.name,
table_name = t.name
FROM
sys.tables AS t
INNER JOIN sys.schemas AS s ON t.schema_id = s.schema_id
LEFT JOIN sys.foreign_keys AS fk
ON t.object_id IN (fk.parent_object_id, fk.referenced_object_id)
WHERE
t.is_ms_shipped = 0
AND fk.object_id IS NULL
;
クエリでは、各テーブルのスキーマ名も追加で表示されます。これは、システムがデフォルト以外のdboスキーマを使用して構築される場合があるためです。
検索からis_ms_shipped = 0
フィルターも含めました。これは、定義済み/システムテーブルを検索から除外することを想定しているためです。