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()を取得する方法を参照してください。