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

SQLServerで主キーを持つすべてのテーブルを返す7つの方法

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


    1. OracleにリンクされているSQLServerからSQLクエリを作成するときに、日付リテラルを指定するにはどうすればよいですか?

    2. MariaDB LOCALTIMESTAMP()の説明

    3. SwarmClusterを使用したAzureContainerServiceでのDockerの使用

    4. MySQLでサーバーによってサポートされている照合を見つける方法