SQL Server:如何在视图中查找未使用的字段

时间:2010-11-10 16:45:54

标签: sql sql-server-2005 views

有没有办法识别视图中由数据库中其他对象引用的字段(例如procs,UDF,其他视图)?

我有大约50个视图,它们将基础数据作为外部数据库引用。本地视图基本上来自外部数据库表的“SELECT *”。

我们正在更改外部数据库,我们需要弄清楚使用视图的应用程序实际使用了哪些字段,以便我们可以设置新的外部数据库以仅包含我们需要的字段。

谢谢!

3 个答案:

答案 0 :(得分:2)

使用:

SELECT OBJECT_NAME(m.object_id), m.*
  FROM SYS.SQL_MODULES m
 WHERE m.definition like N'%my_view_name%'

这将允许您搜索视图引用,包括特定的列引用。

背景:

SYSCOMMENTSINFORMATION_SCHEMA.VIEWS和INFORMATION_SCHEMA.routines具有NVARCHAR(4000)列,而SYS.SQL_MODULES定义列为NVARCHAR(MAX)。因此,如果在位置3998使用“myViewName”,则无法找到它。 SYSCOMMENTS确实有多行,但ROUTINES会截断。

答案 1 :(得分:1)

更新

正如OMG Poines在搜索定义时指出的那样,你想要使用模块

您可能仍然希望列也是如此,因此您需要将其加入sys.columns表

SELECT OBJECT_NAME(m.object_id), c.*
  FROM SYS.SQL_MODULES m
        INNER JOIN sys.columns c
        ON m.object_id = c.object_Id
 WHERE m.definition like N'%externalDB%'

对于使用2005年或以后的可怜的灵魂,您仍然可以使用以下内容。

查找低于4000个字符数限制的视图

SELECT * 
FROM INFORMATION_SCHEMA.VIEWS
where 
VIEW_DEFINITION like '%externalDB%'

如果您想要这些视图中的列,您可以执行以下操作

select c.* from 

information_schema.VIEWS vw
INNER JOIN information_schema.COLUMNS c
ON vw.Table_catalog = c.Table_catalog
and vw.TABLE_SCHEMA= c.TABLE_SCHEMA
and vw.TABLE_NAME= c.TABLE_NAME

where 
VIEW_DEFINITION like '%externalDB%'

但是,当然如果这些视图引用了本地表,那么你也可以获得这些列

注意:您可能希望使用SYSCOMMENTS而不是例程,但如果您的搜索字符串正在寻找接近4000的倍数,那么您仍会遇到问题,因此对于那些人来说,这是一个不完整的答案SQL 2000

答案 2 :(得分:0)

如果右键单击Management Studio中的视图,则可以选择“查看依赖项” 这应该显示依赖于所选视图的所有其他对象(存储过程,UDF,其他视图)。

不幸的是,您必须仔细检查每个字段并查看它实际使用的字段。

只要您还没有直接从应用程序调用视图的动态SQL,这应该会有所帮助。