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

OBJECT_NAME()を使用して、SQLServerのobject_idからオブジェクトの名前を取得します

    SQL Serverを使用しているときに、sys.objectsに対して結合を実行しようとしていることに気付いた場合 オブジェクトの名前を取得するためのシステムカタログビュー。最初に停止して読んでください。

    Transact-SQLには、OBJECT_NAME()という組み込み関数があります。 IDに基づいてオブジェクトの名前を返します。

    つまり、オブジェクトのID(たとえば、object_id)がある場合 列)、そのIDをOBJECT_NAME()に渡すだけです。 関数を実行すると、オブジェクトの名前が返されます。結合は必要ありません!

    例1-基本的な使用法

    これがどのように機能するかを示す基本的な例です。

    SELECT 
      name,
      object_id,
      OBJECT_NAME(object_id) AS [OBJECT_NAME(object_id)]
    FROM sys.objects
    WHERE name = 'Artists';
    

    結果:

    +---------+-------------+--------------------------+
    | name    | object_id   | OBJECT_NAME(object_id)   |
    |---------+-------------+--------------------------|
    | Artists | 885578193   | Artists                  |
    +---------+-------------+--------------------------+
    

    ここでは、最初の2列にオブジェクトの名前とIDがそれぞれ表示されていることがわかります。 3番目の列はOBJECT_NAME()を使用します IDから名前を返す関数。

    これは明らかに単なる例ですが、この場合はOBJECT_NAME()を使用します sys.objectsのため、不要でした すでにオブジェクトの名前を返しています。

    次の例は、OBJECT_NAME()の場所を示しています 重宝します。

    例2–より便利な例

    この例では、sys.foreign_keysにクエリを実行して、外部キーに関する情報を返します。 システムカタログビュー。

    まず、すべての列を選択して、このビューから何が返されるかを確認しましょう。

    USE Music;
    SELECT * 
    FROM sys.foreign_keys
    WHERE name = 'FK_Artists_Country';
    

    結果(垂直出力を使用):

    name                           | FK_Artists_Country
    object_id                      | 1253579504
    principal_id                   | NULL
    schema_id                      | 1
    parent_object_id               | 885578193
    type                           | F 
    type_desc                      | FOREIGN_KEY_CONSTRAINT
    create_date                    | 2019-08-27 16:14:39.560
    modify_date                    | 2019-08-28 03:28:07.040
    is_ms_shipped                  | 0
    is_published                   | 0
    is_schema_published            | 0
    referenced_object_id           | 1205579333
    key_index_id                   | 1
    is_disabled                    | 0
    is_not_for_replication         | 0
    is_not_trusted                 | 0
    delete_referential_action      | 0
    delete_referential_action_desc | NO_ACTION
    update_referential_action      | 0
    update_referential_action_desc | NO_ACTION
    is_system_named                | 0
    

    このビューは外部キーの名前を返しますが、その親オブジェクトの名前は返しません。また、外部キーの参照オブジェクトの名前も返しません。それらのオブジェクトのID(つまり、parent_object_idのみを返します) およびreferenced_object_id

    したがって、これらの列だけに絞り込むと、次のようになります。

    USE Music;
    SELECT
      name,
      parent_object_id,
      referenced_object_id
    FROM sys.foreign_keys
    WHERE name = 'FK_Artists_Country';
    

    結果:

    +--------------------+--------------------+------------------------+
    | name               | parent_object_id   | referenced_object_id   |
    |--------------------+--------------------+------------------------|
    | FK_Artists_Country | 885578193          | 1205579333             |
    +--------------------+--------------------+------------------------+
    

    幸い、最後の2列をOBJECT_NAME()に渡すことができます オブジェクト名を取得するため。

    名前を返すためにできることは次のとおりです。

    USE Music;
    SELECT
      name AS [Foreign Key],
      OBJECT_NAME(parent_object_id) AS [Parent Object Name],
      OBJECT_NAME(referenced_object_id) AS [Referenced Object Name]
    FROM sys.foreign_keys
    WHERE name = 'FK_Artists_Country';
    

    結果:

    +--------------------+----------------------+--------------------------+
    | Foreign Key        | Parent Object Name   | Referenced Object Name   |
    |--------------------+----------------------+--------------------------|
    | FK_Artists_Country | Artists              | Country                  |
    +--------------------+----------------------+--------------------------+
    

    最後の2列については、関連する値をOBJECT_NAME()に渡します。 各親オブジェクトの名前を返すように関数を指定します。

    例3– WHERE句でOBJECT_NAME()を使用する

    OBJECT_NAME()の使用例を次に示します。 WHERE 条項。

    SELECT 
      name, 
      object_id, 
      type_desc  
    FROM sys.objects  
    WHERE name = OBJECT_NAME(1253579504);
    

    結果:

    +--------------------+-------------+------------------------+
    | name               | object_id   | type_desc              |
    |--------------------+-------------+------------------------|
    | FK_Artists_Country | 1253579504  | FOREIGN_KEY_CONSTRAINT |
    +--------------------+-------------+------------------------+
    

    クロスデータベースクエリ

    既定では、SQL Serverは、オブジェクトIDが現在のデータベースのコンテキストにあると想定します。別のデータベースのIDを参照するクエリは、NULLまたは誤った結果を返します。

    別のデータベースからオブジェクト名を検索する必要がある場合は、OBJECT_NAME()を呼び出すときに、そのデータベースのIDを2番目の引数として指定できます。 。

    例については、SQL Serverの別のデータベースからOBJECT_NAME()を取得する方法を参照してください。


    1. SQLServer-ストアドプロシージャが終了するまでテーブルをロックする方法

    2. 共有サーバーでのMySQLユーザー権限

    3. Oracle監査の存続

    4. SQLDeveloperでシーケンストリガーからPKを作成する方法を学ぶ