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

Posted

技术标签:

【中文标题】SQL Server:如何在视图中查找未使用的字段【英文标题】:SQL Server: How to find unused fields in view 【发布时间】:2010-11-10 16:45:53 【问题描述】:

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

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

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

谢谢!

【问题讨论】:

【参考方案1】:

用途:

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

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

背景:

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

【讨论】:

+1 我得更好地了解 2005 年引入的 sys 表【参考方案2】:

更新

正如 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

【讨论】:

【参考方案3】:

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

不幸的是,您必须逐个查看它实际使用的字段。

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

【讨论】:

以上是关于SQL Server:如何在视图中查找未使用的字段的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server中如何识别查找未使用的索引(unused indexes)

SQL Server中如何识别查找未使用的索引(unused indexes)

sql server中如何查找一天内固定时间段内某个字段对应的记录条数?

Sql Server2005数据库怎么查看视图里的字段。

sql server表值函数和视图如何一起使用

Sql Server2005数据库怎么查看视图里的字段。