sql >> データベース >  >> RDS >> Sqlserver

SQLServerで主キーなしですべてのテーブルを返す3つの方法

    データベースに主キーを持たないテーブルがあるかどうかを確認する必要がある場合は、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)
    

    1. NaviCatMySQLクライアントを使用してデータベースに接続する方法

    2. MySQL5.6非GTIDからGTIDを使用したMySQL5.7へのオンライン移行

    3. 保存された仕様の接続文字列パラメータ

    4. 文字列を区切り文字として使用して、正規表現を使用して文字列を分割するにはどうすればよいですか?