データベースに主キーを持たないテーブルがあるかどうかを確認する必要がある場合は、SQL Serverで次のスクリプトのいずれかを実行して、それらのテーブルのみを返すことができます。
これらのスクリプトはすべて、OBJECTPROPERTY()
を利用しています。 働き。この関数は、TableHasPrimaryKey
を受け入れます 0
の値を確認できる引数 。 0
の場合 、テーブルには主キーがありません。 1
の場合 します。したがって、この関数を使用して、すべてのテーブルをで返すこともできます。 主キー。
これらのスクリプトは、テーブルの名前とそのスキーマを返すだけですが、いつでも変更して、より多くの列を返すことができます。
オプション1-sys.tablesを使用したOBJECTPROPERTY()
sys.tables
システムビューは、おそらく最も明白な出発点です。このビューは、各ユーザーテーブルの行を返し、OBJECTPROPERTY()
を使用すると TableHasPrimaryKey
に基づいて結果をフィルタリングします プロパティは0
、主キーなしでそれらのテーブルだけを取得します。
USE Test; SELECT SCHEMA_NAME(schema_id) AS [Schema], name AS [Table] FROM sys.tables WHERE OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') = 0 ORDER BY [Schema], [Table];
結果:
Changed database context to 'Test'. +----------+--------------------+ | Schema | Table | |----------+--------------------| | dbo | Datetime2Test | | dbo | Datetime2Test2 | | dbo | DatetimeoffsetTest | | dbo | Individual | | dbo | Occupation | | dbo | Team | | dbo | TimeTest | +----------+--------------------+ (7 rows affected)
この場合、私の現在のデータベースは、主キーのないテーブルがたくさんあるテストデータベースです。
別のデータベースで同じステートメントを実行すると、結果が得られません。
USE Music; SELECT SCHEMA_NAME(schema_id) AS [Schema], name AS [Table] FROM sys.tables WHERE OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') = 0 ORDER BY [Schema], [Table];
結果:
Changed database context to 'Music'. (0 rows affected)
オプション2– OBJECTPROPERTY()とINFORMATION_SCHEMA.TABLES
この例は前の例と似ていますが、今回はINFORMATION_SCHEMA.TABLES
にクエリを実行している点が異なります。 見る。 SQL Serverに含まれる情報スキーマビューは、INFORMATION_SCHEMAのISO標準定義に準拠しています。
USE Test; SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE OBJECTPROPERTY(OBJECT_ID(CONCAT(TABLE_SCHEMA, '.', TABLE_NAME)),'TableHasPrimaryKey') = 0 AND TABLE_TYPE='BASE TABLE' ORDER BY TABLE_SCHEMA, TABLE_NAME;>
結果:
Changed database context to 'Test'. +----------------+--------------------+ | TABLE_SCHEMA | TABLE_NAME | |----------------+--------------------| | dbo | Datetime2Test | | dbo | Datetime2Test2 | | dbo | DatetimeoffsetTest | | dbo | Individual | | dbo | Occupation | | dbo | Team | | dbo | TimeTest | +----------------+--------------------+ (7 rows affected)
オプション3– sys.objectsを使用したOBJECTPROPERTY()
この例では、sys.objects
にクエリを実行します 見る。これは、前の2つと比較すると、より一般的なビューであり、スキーマスコープのオブジェクト(テーブルだけでなく)に関する情報を返します。このため、type = 'U'
を使用して結果をフィルタリングする必要があります 。 U
ここでは、ユーザー定義テーブルを表します。
ここでも、OBJECTPROPERTY()
を使用できます 結果を主キーを持たないテーブルのみにフィルタリングする機能。
USE Test; 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') = 0 ORDER BY [Schema], [Table]
結果:
Changed database context to 'Test'. +----------+--------------------+ | Schema | Table | |----------+--------------------| | dbo | Datetime2Test | | dbo | Datetime2Test2 | | dbo | DatetimeoffsetTest | | dbo | Individual | | dbo | Occupation | | dbo | Team | | dbo | TimeTest | +----------+--------------------+ (7 rows affected)
または、type_desc = 'USER_TABLE'
でフィルタリングすることもできます。 、同じ結果が得られます。
USE Test; SELECT SCHEMA_NAME(schema_id) AS [Schema], name AS [Table] FROM sys.objects WHERE type_desc = 'USER_TABLE' AND OBJECTPROPERTY(OBJECT_ID(CONCAT(SCHEMA_NAME(schema_id), '.', name)), 'TableHasPrimaryKey') = 0 ORDER BY [Schema], [Table]
結果:
Changed database context to 'Test'. +----------+--------------------+ | Schema | Table | |----------+--------------------| | dbo | Datetime2Test | | dbo | Datetime2Test2 | | dbo | DatetimeoffsetTest | | dbo | Individual | | dbo | Occupation | | dbo | Team | | dbo | TimeTest | +----------+--------------------+ (7 rows affected)