Skrip @NoFuchsGavin biasanya berfungsi dengan baik tetapi memiliki beberapa keterbatasan karena masalah dengan sysdepends
(lihat postingan blog ini oleh Pinal Dave
untuk contoh di mana ini memberikan hasil yang salah).
Microsoft
juga menyarankan agar Anda menghindari penggunaan sysdepends
dalam pekerjaan pengembangan baru.
Oleh karena itu, kita dapat menggunakan sys.dm_sql_referencing_entities
dan sys.dm_sql_referenced_entities
seperti yang disarankan di sini
.
Namun saya perhatikan bahwa ini terkadang mengecualikan referensi kolom karena referenced_minor_name
menjadi NULL. Oleh karena itu saya telah menambahkan kondisi lain yang dapat menimbulkan kesalahan positif tetapi memastikan bahwa referensi kolom tidak dihilangkan dari kumpulan hasil.
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
Skrip di atas didasarkan pada jawaban @NoFuchsGavin dan entri blog ini .
Saya tertarik untuk mengetahui apakah ada yang berhasil menemukan cara yang lebih baik yang tidak menimbulkan negatif atau positif palsu.