SQL Serverで主キーを持つすべてのテーブルを検索する必要がある場合は、この記事が役立ちます。
この記事では、主キーを持つ現在のデータベース内のすべてのテーブルを返す7つの方法を提供します。
これらの例のほとんどは、主キー自体ではなく、テーブルのみを返すことに注意してください。主キーのリストが必要な場合は、SQLServerで主キーを返す11の方法を参照してください。
オプション1-sys.tablesを使用したOBJECTPROPERTY()
最初のオプションでは、OBJECTPROPERTY()を使用します sys.tablesにクエリを実行するときに機能します システムビュー。この関数は、TableHasPrimaryKeyを受け入れます 口論。この引数の値が1の場合 、主キーを持つすべてのテーブルを取得します(0の場合 次に、主キーを持たないすべてのテーブルを取得します。
SELECT SCHEMA_NAME(schema_id) AS [Schema], name AS [Table] FROM sys.tables WHERE OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') = 1 ORDER BY [Schema], [Table];
結果:
+----------+---------+ | Schema | Table | |----------+---------| | dbo | Albums | | dbo | Artists | | dbo | Country | | dbo | Genres | +----------+---------+
この例では、現在のデータベースに主キーを持つ4つのテーブルがあります。
残りの例では同じデータベースにクエリを実行するため、これらのクエリの結果は同じになります。
オプション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)),'TableHasPrimaryKey') = 1 AND TABLE_TYPE='BASE TABLE' ORDER BY TABLE_SCHEMA, TABLE_NAME;
結果:
+----------------+--------------+ | TABLE_SCHEMA | TABLE_NAME | |----------------+--------------| | dbo | Albums | | dbo | Artists | | dbo | Country | | dbo | Genres | +----------------+--------------+
オプション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)), 'TableHasPrimaryKey') = 1 ORDER BY [Schema], [Table]
結果:
+----------+---------+ | Schema | Table | |----------+---------| | dbo | Albums | | dbo | Artists | | dbo | Country | | dbo | Genres | +----------+---------+
オプション4– INFORMATION_SCHEMA.TABLE_CONSTRAINTS
INFORMATION_SCHEMA.TABLE_CONSTRAINTSをクエリできます 主キーを持つテーブルのリストを取得するために表示します。 CONSTRAINT_TYPEを持つ行のみに結果をフィルタリングする必要があります PRIMARY KEYの 。
SELECT CONSTRAINT_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'PRIMARY KEY';
結果:
+---------------------+--------------+ | CONSTRAINT_SCHEMA | TABLE_NAME | |---------------------+--------------| | dbo | Artists | | dbo | Genres | | dbo | Albums | | dbo | Country | +---------------------+--------------+
このビューは制約名も返すため、必要に応じてその列を含めることもできます。
SELECT CONSTRAINT_SCHEMA, TABLE_NAME, CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'PRIMARY KEY';
結果:
+---------------------+--------------+-------------------------------+ | CONSTRAINT_SCHEMA | TABLE_NAME | CONSTRAINT_NAME | |---------------------+--------------+-------------------------------| | dbo | Artists | PK__Artists__25706B50FCD918B1 | | dbo | Genres | PK__Genres__0385057E88BB96F8 | | dbo | Albums | PK__Albums__97B4BE379FC780BD | | dbo | Country | PK__Country__10D1609F97ADEC31 | +---------------------+--------------+-------------------------------+
オプション5– sys.key_constraints
sys.key_constraintsをフィルタリングできます CONSTRAINT_TYPEを表示する PKの 主キーを持つテーブルのリストを取得します。
SELECT SCHEMA_NAME(schema_id) AS [Schema], OBJECT_NAME(parent_object_id) AS [Table] FROM sys.key_constraints WHERE type = 'PK';
結果:
+----------+---------+ | Schema | Table | |----------+---------| | dbo | Artists | | dbo | Genres | | dbo | Albums | | dbo | Country | +----------+---------+
ここでも主キー名が付いています:
SELECT SCHEMA_NAME(schema_id) AS [Schema], OBJECT_NAME(parent_object_id) AS [Table], name FROM sys.key_constraints WHERE type = 'PK';
結果:
+----------+---------+-------------------------------+ | Schema | Table | name | |----------+---------+-------------------------------| | dbo | Artists | PK__Artists__25706B50FCD918B1 | | dbo | Genres | PK__Genres__0385057E88BB96F8 | | dbo | Albums | PK__Albums__97B4BE379FC780BD | | dbo | Country | PK__Country__10D1609F97ADEC31 | +----------+---------+-------------------------------+
オプション6– sys.objects
sys.objects システムビューは、主キーを含むスキーマスコープのオブジェクトに関する情報を返すための一般的なビューです。
SELECT SCHEMA_NAME(schema_id) AS [Schema], OBJECT_NAME(parent_object_id) AS [Table] FROM sys.objects WHERE type = 'PK';
結果:
+----------+---------+ | Schema | Table | |----------+---------| | dbo | Artists | | dbo | Genres | | dbo | Albums | | dbo | Country | +----------+---------+
前の2つの例と同様に、nameを含めることができます このビューの列には、主キーの名前が表示されます:
SELECT SCHEMA_NAME(schema_id) AS [Schema], OBJECT_NAME(parent_object_id) AS [Table], name FROM sys.objects WHERE type = 'PK';
結果:
+----------+---------+-------------------------------+ | Schema | Table | name | |----------+---------+-------------------------------| | dbo | Artists | PK__Artists__25706B50FCD918B1 | | dbo | Genres | PK__Genres__0385057E88BB96F8 | | dbo | Albums | PK__Albums__97B4BE379FC780BD | | dbo | Country | PK__Country__10D1609F97ADEC31 | +----------+---------+-------------------------------+
オプション7– OBJECTPROPERTYEX()
OBJECTPROPERTYEX() 関数はOBJECTPROPERTY()と同じように機能します より多くのプロパティをサポートすることを除いて、関数。したがって、OBJECTPROPERTY()を使用する前述の例のいずれか 、OBJECTPROPERTYEX()を使用するように簡単に書き直すことができます 。
たとえば、このページの最初の例を次のように書き直すことができます。
SELECT SCHEMA_NAME(schema_id) AS [Schema], name AS [Table] FROM sys.tables WHERE OBJECTPROPERTYEX(object_id, 'TableHasPrimaryKey') = 1 ORDER BY [Schema], [Table];
結果:
+----------+---------+ | Schema | Table | |----------+---------| | dbo | Albums | | dbo | Artists | | dbo | Country | | dbo | Genres | +----------+---------+
OBJECTPROPERTYEX() sql_variantを返します データ型、OBJECTPROPERTY() intを返します 。