この記事では、SQLServerのデータベースに外部キーを持つすべてのテーブルを返す7つの方法を紹介します。
各テーブルは、外部キーの数に関係なく、1回だけ返されます。これは、すべての外部キーとそのテーブルを返すこととは異なります。これを行う場合は、SQLServerで外部キーを返す11の方法を参照してください。
ここでのすべての例は同じデータベースをクエリするため、同じ結果を返します。
オプション1-sys.tablesを使用したOBJECTPROPERTY()
最初のオプションは、OBJECTPROPERTY()
を使用することです sys.tables
にクエリを実行するときに機能します システムビュー。
この関数は、TableHasForeignKey
を受け入れます 引数。1
のいずれかになります。 または0
(またはNULL
)。 1
の場合 、これは、テーブルに外部キーがあることを意味します。 0
の値 これは、外部キーがないことを意味します。したがって、これをWHERE
で使用できます TableHasForeignKey
があるテーブルのみを返す句 1
に設定されています 。
SELECT SCHEMA_NAME(schema_id) AS [Schema], name AS [Table] FROM sys.tables WHERE OBJECTPROPERTY(object_id, 'TableHasForeignKey') = 1 ORDER BY [Schema], [Table];
結果:
+----------+---------+ | Schema | Table | |----------+---------| | dbo | Albums | | dbo | Artists | +----------+---------+
オプション2– OBJECTPROPERTY()とINFORMATION_SCHEMA.TABLES
この例では、OBJECTPROPERTY()
を使用しています INFORMATION_SCHEMA.TABLES
をクエリするとき システムビュー。
SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE OBJECTPROPERTY(OBJECT_ID(CONCAT(TABLE_SCHEMA, '.', TABLE_NAME)),'TableHasForeignKey') = 1 AND TABLE_TYPE='BASE TABLE' ORDER BY TABLE_SCHEMA, TABLE_NAME;
結果:
+----------------+--------------+ | TABLE_SCHEMA | TABLE_NAME | |----------------+--------------| | dbo | Albums | | dbo | Artists | +----------------+--------------+
オプション3– sys.objectsを使用したOBJECTPROPERTY()
OBJECTPROPERTY()
を使用するさらに別のオプションがあります 。今回は、sys.objects
をクエリするときに使用します システムビュー。
SELECT SCHEMA_NAME(schema_id) AS [Schema], name AS [Table] FROM sys.objects WHERE type = 'U' AND OBJECTPROPERTY(OBJECT_ID(CONCAT(SCHEMA_NAME(schema_id), '.', name)), 'TableHasForeignKey') = 1 ORDER BY [Schema], [Table]
結果:
+----------+---------+ | Schema | Table | |----------+---------| | dbo | Albums | | dbo | Artists | +----------+---------+
オプション4–DISTINCTを使用したINFORMATION_SCHEMA.TABLE_CONSTRAINTS
INFORMATION_SCHEMA.TABLE_CONSTRAINTS
をクエリする例を次に示します。 制約タイプがFOREIGN KEY
であるシステムビュー 。この場合、DISTINCT
も使用します 複数の外部キーがある場合にテーブルが複数回返されるのを防ぐための句。
SELECT DISTINCT CONSTRAINT_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'FOREIGN KEY';
結果:
+---------------------+--------------+ | CONSTRAINT_SCHEMA | TABLE_NAME | |---------------------+--------------| | dbo | Albums | | dbo | Artists | +---------------------+--------------+
DISTINCT
を削除するとどうなりますか 条項:
SELECT CONSTRAINT_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'FOREIGN KEY';
結果:
+---------------------+--------------+ | CONSTRAINT_SCHEMA | TABLE_NAME | |---------------------+--------------| | dbo | Albums | | dbo | Albums | | dbo | Artists | +---------------------+--------------+
この場合、Albums
テーブルには2つの外部キーがあるため、その1つのテーブルに対して2つの行を取得します。
オプション5–DISTINCTを使用したsys.foreign_keys
DISTINCT
を使用する別の例を次に示します。 句ですが、今回はsys.foreign_keys
にクエリを実行しています システムビュー。
SELECT DISTINCT OBJECT_SCHEMA_NAME(fk.parent_object_id) AS [Schema], OBJECT_NAME(fk.parent_object_id) AS [Table] FROM sys.foreign_keys AS fk ORDER BY [Schema], [Table];
結果:
+----------+---------+ | Schema | Table | |----------+---------| | dbo | Albums | | dbo | Artists | +----------+---------+
そして、ここにはDISTINCT
がありません 条項:
SELECT OBJECT_SCHEMA_NAME(fk.parent_object_id) AS [Schema], OBJECT_NAME(fk.parent_object_id) AS [Table] FROM sys.foreign_keys AS fk ORDER BY [Schema], [Table];
結果:
+----------+---------+ | Schema | Table | |----------+---------| | dbo | Albums | | dbo | Albums | | dbo | Artists | +----------+---------+
オプション6– sys.foreign_keys with GROUP BY
これは、sys.foreign_keys
にクエリを実行するという点で、前の例と似ています。 システムビュー。違いは、DISTINCT
を使用するのではなく 句では、GROUP BY
を使用します 代わりに句。
SELECT OBJECT_SCHEMA_NAME(fk.parent_object_id) AS [Schema], OBJECT_NAME(fk.parent_object_id) AS [Table] FROM sys.foreign_keys AS fk GROUP BY OBJECT_SCHEMA_NAME(fk.parent_object_id), OBJECT_NAME(fk.parent_object_id);
結果:
+----------+---------+ | Schema | Table | |----------+---------| | dbo | Albums | | dbo | Artists | +----------+---------+
オプション7– OBJECTPROPERTYEX()
この例は、以前のいくつかの例を倍増している可能性がありますが、それでも言及する価値があります。
OBJECTPROPERTY()
を使用する前の例のいずれか 関数は、OBJECTPROPERTYEX()
を使用するように簡単に書き直すことができます 働き。この関数は基本的にOBJECTPROPERTY()
の拡張です 、そしてそれはすべてを行いますOBJECTPROPERTY()
したがって、このページの最初の例を次のように書き直すことができます。
SELECT SCHEMA_NAME(schema_id) AS [Schema], name AS [Table] FROM sys.tables WHERE OBJECTPROPERTYEX(object_id, 'TableHasForeignKey') = 1 ORDER BY [Schema], [Table];
結果:
+----------+---------+ | Schema | Table | |----------+---------| | dbo | Albums | | dbo | Artists | +----------+---------+
知っておくべき違いの1つは、これら2つの関数が異なる戻り型を返すことです。 OBJECTPROPERTY()
intを返します 一方、OBJECTPROPERTYEX()
sql_variantを返します タイプ。