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)