下边的脚本使用表值函型数sysdm_sql_referenced_returns寻找所有引用SalesHistory表的对象这一查询不但返回SalesHistory表的引用还包含被引用的SalesHistory表中的字段值得注意的是CROSS APPLY操作符的使用这是因为实体是表值型函数而且在将字段值赋予表值型函数时需要APPLY操作符还要注意如果遇到引用一个不存在的实体字段 对sysdm_referenced_entities函数的调用会出错
SELECT ReferencedEntityName = oname greferenced_entity_name referenced_minor_name
FROM sysobjects o
JOIN sysschemas s on oschema_id = sschema_id
CROSS APPLY sysdm_sql_referenced_entities(sname + + oname OBJECT) g
WHERE referenced_entity_name = SalesHistory
在下边的脚本中创建了一个新的名称为usp_GetSalesFromArchive的存储的过程该过程引用不存在的SalesHistoryArchive 表
CREATE PROCEDURE usp_GetSalesFromArchive
(
@Product VARCHAR()
)
AS
BEGIN
SELECT COUNT(SaleArchiveID) AS SalesCount SUM(SaleArchivePrice) AS SalesAmount
FROM dboSalesHistoryArchive sh
END
现在可以利用 syssql_expression_dependencies系统视图寻找引用SalesHistoryArchive 表的任何对象
或者可以稍微改变该查询来寻找存储的过程usp_GetSalesFromArchive引用的表
SELECT ReferencingObject = oname
ReferencedObject = dreferenced_entity_name
FROM syssql_expression_dependencies d
join sysobjects o on dreferencing_id = oobject_id
WHERE oname = usp_GetSalesFromArchive
结论
通过对象名称而不是对象ID跟蹤相关性拥有诸多好处用户可能喜欢寻找存储的过程该过程引用并不存在的对象因为这帮助用户寻找不再使用或需要更新的任何存储的过程
[] []