有没有办法识别视图中由数据库中其他对象引用的字段(例如procs,UDF,其他视图)?
我有大约50个视图,它们将基础数据作为外部数据库引用。本地视图基本上来自外部数据库表的“SELECT *”。
我们正在更改外部数据库,我们需要弄清楚使用视图的应用程序实际使用了哪些字段,以便我们可以设置新的外部数据库以仅包含我们需要的字段。
谢谢!
答案 0 :(得分:2)
使用:
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 :(得分: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,这应该会有所帮助。