开发人员通常会发现他们以前为某个对象选择的名称会引起问题。坏消息是在大多数开发人员意识到他们所选择的对象名称有问题时,一般在数据库中已经有了几百个视图、存储过程和函数——而且这些对象名称已经出现了很多次。
在冒风险更改对象名称之前,你需要确定任务量。在感兴趣的对象是表或视图时,你可以使用 Enterprise Manager (企业管理器) 中内建的Dependencies (相关性)工具。要使用这一工具,运行企业管理器,展开数据库节点,扩展你所关心的子节点(表或视图),右键点击你所关心的对象,选择 All Tasks (所有任务),然后选择 Show Dependencies (显示相关性)。这样将得到两个列表:Objects That Depend On X (依附于 X 的对象) 和Objects That X Depends On (X 依附的对象)。该工具甚至还提供了一个复选框用于选择是只显示第一级的相关性,还是显示所有级的相关性。然而,事实上你不能用这些列表做任何事情。
要想得到一个更加有用的列表(例如,可以拷贝和粘贴),你可以在联接查询sysobjects和sysdepends表,如下所示:
SELECT
sysobjects.name, *
FROM sysdepends
JOIN sysobjects ON sysdepends.id
= sysobjects.id
ORDER BY sysobjects.name
如果有需要,还可以添加WHERE 谓词。你依然需要添加更多东西才能得到你要的结果,因为它所有能为你提供的是依赖对象的 ID,你必须转换这个 ID。
在感兴趣的对象不是表或视图而是一个列名时,问题就出现了。企业管理器没有提供一种简便的方法来确定依赖给定列的所有存储过程、视图和用户函数。
有关所有这些对象的文字都存储在表syscomments的一个叫做 Text 的列中。该表的主键是对象 ID,所以你可以通过将其与sysobjects表进行联接查询以搞清楚对象的名称。
下面的存储过程完成这个联接,并接受一个参数,这个参数被认为是感兴趣的对象。你可以传入一个表或视图的名称。它能正确执行,但是我编写这个过程主要是为了处理列名称。
CREATE
PROCEDURE ap_Occurrences
(
@Target varchar(100)
)
AS
/* SET NOCOUNT ON */
SELECT
sysobjects.Name,
syscomments.Text,
CASE
WHEN xtype
= 'P' then 'Stored Procedure'
WHEN xtype
= 'V' then 'View'
WHEN xtype
= 'IF' then 'Function'
ELSE xtype
END
AS 'Object Type'
FROM
syscomments
JOIN sysobjects ON syscomments.id
= sysobjects.id
WHERE
CHARINDEX(@Target, Text) > 0
ORDER BY [Object Type], Name
RETURN
要测试这个过程,打开查询分析器,选择一个感兴趣的数据库,然后将上面的代码粘贴到一个窗口中。执行代码以创建存储过程,然后以如下方式调用存储过程:
Ap_Occurrences 'OrderID'
你将得到一个引用了OrderID或者你作为参数传入的值的用户函数、存储过程以及视图列表。