この記事では、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を返します タイプ。