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を返します 。