Tập lệnh của @ NoFuchsGavin thường hoạt động tốt nhưng có một số hạn chế do sự cố với sysdepends
(xem bài đăng trên blog này của Pinal Dave
ví dụ trong đó điều này cho kết quả không chính xác).
Microsoft
cũng khuyên bạn nên tránh sử dụng sysdepends
trong công việc phát triển mới.
Do đó, chúng tôi có thể sử dụng sys.dm_sql_referencing_entities
và sys.dm_sql_referenced_entities
như được đề xuất tại đây
.
Tuy nhiên, tôi nhận thấy rằng điều này đôi khi loại trừ các tham chiếu cột do referenced_minor_name
là NULL. Do đó, tôi đã thêm một điều kiện khác có thể tạo ra kết quả dương tính giả nhưng đảm bảo rằng các tham chiếu cột không bị bỏ qua khỏi tập kết quả.
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
Tập lệnh trên dựa trên câu trả lời của @ NoFuchsGavin và bài đăng trên blog này .
Tôi muốn biết liệu có ai đã tìm ra cách tốt hơn để không tạo ra các tiêu cực hoặc dương tính giả hay không.