@NoFuchsGavin のスクリプトは通常はうまく機能しますが、sysdepends
の問題によりいくつかの制限があります (Pinal Dave によるこのブログ投稿
これが間違った結果をもたらす例)。
マイクロソフト
また、sysdepends
の使用を避けることをお勧めします
したがって、sys.dm_sql_referencing_entities
を使用できます。 および sys.dm_sql_referenced_entities
提案どおり ここ
.
ただし、これにより referenced_minor_name
が原因で列参照が除外される場合があることに気付きました NULL であること。したがって、誤検知を引き起こす可能性がありますが、列参照が結果セットから省略されないようにする別の条件を追加しました。
DECLARE @SchemaName sysname = '{0}'; DECLARE @TableName sysname = '{1}'; DECLARE @ColumnName sysname = '{2}'; SELECT @SchemaName + '.' + @TableName AS [USED_OBJECT], @ColumnName AS [COLUMN], referencing.referencing_schema_name + '.' + referencing_entity_name AS USAGE_OBJECT, CASE so.type WHEN 'C' THEN 'CHECK constraint' WHEN 'D' THEN 'Default' WHEN 'F' THEN 'FOREIGN KEY' WHEN 'FN' THEN 'Scalar function' WHEN 'IF' THEN 'In-lined table-function' WHEN 'K' THEN 'PRIMARY KEY' WHEN 'L' THEN 'Log' WHEN 'P' THEN 'Stored procedure' WHEN 'R' THEN 'Rule' WHEN 'RF' THEN 'Replication filter stored procedure' WHEN 'S' THEN 'System table' WHEN 'SP' THEN 'Security policy' WHEN 'TF' THEN 'Table function' WHEN 'TR' THEN 'Trigger' WHEN 'U' THEN 'User table' WHEN 'V' THEN 'View' WHEN 'X' THEN 'Extended stored procedure' END AS USAGE_OBJECTTYPE, so.[type] AS USAGE_OBJECTTYPEID FROM sys.dm_sql_referencing_entities ( @SchemaName + '.' + @TableName, 'object' ) referencing INNER JOIN sys.objects so ON referencing.referencing_id = so.object_id WHERE EXISTS ( SELECT * FROM sys.dm_sql_referenced_entities ( referencing_schema_name + '.' + referencing_entity_name, 'object' ) referenced WHERE referenced_entity_name = @TableName AND ( referenced.referenced_minor_name LIKE @ColumnName -- referenced_minor_name is sometimes NULL -- therefore add below condition (can introduce False Positives) OR ( referenced.referenced_minor_name IS NULL AND OBJECT_DEFINITION ( OBJECT_ID(referencing_schema_name + '.' + referencing_entity_name) ) LIKE '%' + @ColumnName + '%' ) ) ) ORDER BY USAGE_OBJECTTYPE, USAGE_OBJECT
プレ>上記のスクリプトは、@NoFuchsGavin の回答と このブログ投稿 .
誰かが偽陰性や偽陽性を導入しないより良い方法を見つけたのか知りたい.