SQL Serverでは、sys.dm_sql_referenced_entities()
を使用できます。 特定のエンティティの定義で、名前で参照されるすべてのユーザー定義エンティティのリストを取得するシステム動的管理機能。
つまり、特定のエンティティが依存するすべてのユーザー定義エンティティのリストを返します。
具体的には、指定された参照エンティティによって参照される次のエンティティタイプについてレポートします。
- スキーマにバインドされたエンティティ
- スキーマにバインドされていないエンティティ
- クロスデータベースおよびクロスサーバーエンティティ
- スキーマにバインドされたエンティティとスキーマにバインドされていないエンティティに対する列レベルの依存関係
- ユーザー定義タイプ(エイリアスおよびCLR UDT)
- XMLスキーマコレクション
- パーティション関数
構文
構文は次のようになります:
sys.dm_sql_referenced_entities ( ' [ schema_name. ] referencing_entity_name ' , '' ) ::= { OBJECT | DATABASE_DDL_TRIGGER | SERVER_DDL_TRIGGER }
例1-基本的な例
使用例は次のとおりです。
USE Test; SELECT referenced_schema_name AS [Schema], referenced_entity_name AS Entity, referenced_minor_name AS Minor, referenced_class_desc AS Class, is_select_all, is_all_columns_found FROM sys.dm_sql_referenced_entities ( 'dbo.uspGetClient', 'OBJECT');
結果:
+----------+------------+------------+------------------+-----------------+------------------------+ | Schema | Entity | Minor | Class | is_select_all | is_all_columns_found | |----------+------------+------------+------------------+-----------------+------------------------| | dbo | Client | NULL | OBJECT_OR_COLUMN | 1 | 1 | | dbo | Client | ClientCode | OBJECT_OR_COLUMN | 1 | 1 | | dbo | Client | FirstName | OBJECT_OR_COLUMN | 1 | 1 | | dbo | Client | LastName | OBJECT_OR_COLUMN | 1 | 1 | | NULL | clientcode | NULL | TYPE | 0 | 0 | +----------+------------+------------+------------------+-----------------+------------------------+
ここで、dbo.uspGetClient
で参照されているすべてのエンティティを取得します ストアドプロシージャ。この場合、5つのエンティティがあります。
最初のものは「クライアント」と呼ばれるテーブルです。次の3つは、そのテーブル内のすべての列です。最後の1つは、「clientcode」と呼ばれるユーザー定義のエイリアスデータ型です。
また、最初の4つがアスタリスク(*
)を使用するselectステートメントで使用されていることもわかります。 )すべての列を選択するためのワイルドカード(is_select_all
のため) 1
に設定されています )。
分析しているストアドプロシージャを作成するために使用される実際の定義は次のとおりです。
CREATE PROCEDURE [dbo].[uspGetClient] @ClientCode clientcode AS SELECT * FROM [dbo].[Client] WHERE ClientCode = @ClientCode;
はい、これは非常に単純なストアドプロシージャですが、私たちの目的には理想的です。 sys.dm_sql_referenced_entities()
によって返されるすべての参照エンティティを確認できます。 。
また、プロシージャが単一のSELECT
で構成されていることもわかります。 アスタリスクワイルドカードを使用してすべての列を選択するクエリ。
例2–「すべて選択」を削除します(*
)
アスタリスクのワイルドカードを使用してすべての列を選択しないように、ストアドプロシージャを変更してみましょう。
ALTER PROCEDURE [dbo].[uspGetClient] @ClientCode clientcode AS SELECT FirstName, LastName FROM [dbo].[Client] WHERE ClientCode = @ClientCode;
そのため、「FirstName」列と「LastName」列を明示的に返すようになりました。ワイルドカードは見つかりません。
次に、sys.dm_sql_referenced_entities()
を実行します もう一度:
USE Test; SELECT referenced_schema_name AS [Schema], referenced_entity_name AS Entity, referenced_minor_name AS Minor, referenced_class_desc AS Class, is_select_all, is_all_columns_found FROM sys.dm_sql_referenced_entities ( 'dbo.uspGetClient', 'OBJECT');
結果:
+----------+------------+------------+------------------+-----------------+------------------------+ | Schema | Entity | Minor | Class | is_select_all | is_all_columns_found | |----------+------------+------------+------------------+-----------------+------------------------| | dbo | Client | NULL | OBJECT_OR_COLUMN | 0 | 1 | | dbo | Client | ClientCode | OBJECT_OR_COLUMN | 0 | 1 | | dbo | Client | FirstName | OBJECT_OR_COLUMN | 0 | 1 | | dbo | Client | LastName | OBJECT_OR_COLUMN | 0 | 1 | | NULL | clientcode | NULL | TYPE | 0 | 0 | +----------+------------+------------+------------------+-----------------+------------------------+
今回は、is_select_all
列には0
が表示されます すべての行で。
例3–存在しないエンティティの参照
エンティティが存在しないエンティティを参照している場合はどうなりますか?
たとえば、同僚がストアドプロシージャによって実際に参照されている列を削除してから、sys.dm_sql_referenced_entities()
を実行するとどうなりますか。 そのストアドプロシージャに対して?
調べてみましょう。
ALTER TABLE [dbo].[Client] DROP COLUMN LastName;
LastName
を削除しました 私のテーブルの列。
次に、sys.dm_sql_referenced_entities()
を実行します もう一度:
SELECT referenced_schema_name AS [Schema], referenced_entity_name AS Entity, referenced_minor_name AS Minor, referenced_class_desc AS Class, is_select_all, is_all_columns_found FROM sys.dm_sql_referenced_entities ( 'dbo.uspGetClient', 'OBJECT');
結果:
Msg 207, Level 16, State 1, Procedure uspGetClient, Line 4 Invalid column name 'LastName'. Msg 2020, Level 16, State 1, Line 3 The dependencies reported for entity "dbo.uspGetClient" might not include references to all columns. This is either because the entity references an object that does not exist or because of an error in one or more statements in the entity. Before rerunning the query, ensure that there are no errors in the entity and that all objects referenced by the entity exist.
例4–テーブル全体を削除する
テーブル全体を削除するとどうなるか見てみましょう。
DROP TABLE Client;
テーブルが削除されました。
sys.dm_sql_referenced_entities()
を実行します :
SELECT referenced_schema_name AS [Schema], referenced_entity_name AS Entity, referenced_minor_name AS Minor, referenced_class_desc AS Class, is_select_all, is_all_columns_found FROM sys.dm_sql_referenced_entities ( 'dbo.uspGetClient', 'OBJECT');
結果:
Msg 2020, Level 16, State 1, Line 2 The dependencies reported for entity "dbo.uspGetClient" might not include references to all columns. This is either because the entity references an object that does not exist or because of an error in one or more statements in the entity. Before rerunning the query, ensure that there are no errors in the entity and that all objects referenced by the entity exist.
例5–すべての列を返す
Microsoftは、アスタリスク(*
)の使用を特に推奨していません。 )動的管理ビューおよび関数(sys.dm_sql_referenced_entities()
)からすべての列を選択します 1であります)。これは、SQLServerの将来のリリースでスキーマと返されるデータが変更される可能性があるためです。これにより、将来のリリースで列が列リストの最後に追加される可能性があり、すべての列を選択するためにアスタリスクに依存している場合、アプリケーションを混乱させる可能性があります。
そうは言っても、これを行う例は次のとおりです。アスタリスク(*
を使用) )sys.dm_sql_referenced_entities()
からすべての列を選択します 。これは、この関数から実際に返される列を示すためにのみ行っています(少なくともSQL Server 2019では)。
SELECT * FROM sys.dm_sql_referenced_entities ( 'dbo.uspGetClient', 'OBJECT');
結果(垂直出力を使用):
-[ RECORD 1 ]------------------------- referencing_minor_id | 0 referenced_server_name | NULL referenced_database_name | NULL referenced_schema_name | dbo referenced_entity_name | Client referenced_minor_name | NULL referenced_id | 434100587 referenced_minor_id | 0 referenced_class | 1 referenced_class_desc | OBJECT_OR_COLUMN is_caller_dependent | 0 is_ambiguous | 0 is_selected | 1 is_updated | 0 is_select_all | 0 is_all_columns_found | 1 is_insert_all | 0 is_incomplete | 0 -[ RECORD 2 ]------------------------- referencing_minor_id | 0 referenced_server_name | NULL referenced_database_name | NULL referenced_schema_name | dbo referenced_entity_name | Client referenced_minor_name | ClientCode referenced_id | 434100587 referenced_minor_id | 1 referenced_class | 1 referenced_class_desc | OBJECT_OR_COLUMN is_caller_dependent | 0 is_ambiguous | 0 is_selected | 1 is_updated | 0 is_select_all | 0 is_all_columns_found | 1 is_insert_all | 0 is_incomplete | 0 -[ RECORD 3 ]------------------------- referencing_minor_id | 0 referenced_server_name | NULL referenced_database_name | NULL referenced_schema_name | dbo referenced_entity_name | Client referenced_minor_name | FirstName referenced_id | 434100587 referenced_minor_id | 2 referenced_class | 1 referenced_class_desc | OBJECT_OR_COLUMN is_caller_dependent | 0 is_ambiguous | 0 is_selected | 1 is_updated | 0 is_select_all | 0 is_all_columns_found | 1 is_insert_all | 0 is_incomplete | 0 -[ RECORD 4 ]------------------------- referencing_minor_id | 0 referenced_server_name | NULL referenced_database_name | NULL referenced_schema_name | dbo referenced_entity_name | Client referenced_minor_name | LastName referenced_id | 434100587 referenced_minor_id | 3 referenced_class | 1 referenced_class_desc | OBJECT_OR_COLUMN is_caller_dependent | 0 is_ambiguous | 0 is_selected | 1 is_updated | 0 is_select_all | 0 is_all_columns_found | 1 is_insert_all | 0 is_incomplete | 0 -[ RECORD 5 ]------------------------- referencing_minor_id | 0 referenced_server_name | NULL referenced_database_name | NULL referenced_schema_name | NULL referenced_entity_name | clientcode referenced_minor_name | NULL referenced_id | 257 referenced_minor_id | 0 referenced_class | 6 referenced_class_desc | TYPE is_caller_dependent | 0 is_ambiguous | 0 is_selected | 0 is_updated | 0 is_select_all | 0 is_all_columns_found | 0 is_insert_all | 0 is_incomplete | 0 (5 rows affected)
公式ドキュメント
詳細と例については、sys.dm_sql_referenced_entities
を参照してください。 MicrosoftのWebサイトで。