微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

列出所有数据库的所有过程中引用的所有列

如何解决列出所有数据库的所有过程中引用的所有列

这将得到您想要的列表,但是,如果您在动态sql中嵌入了此类列引用(并且可能找不到依赖于延迟名称解析的引用),则将无济于事。sql Server不会解析存储过程的文本以提供DMV输出

现在尝试使用COLLATE子句来处理在同一服务器上具有不同归类的数据库的情况。

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'UNION ALL
SELECT 
  [database]  = ''' + REPLACE(name, '''', '''''') + ''',
  [procedure] = QUOTENAME(s.name) + ''.'' + QUOTENAME(p.name)
                COLLATE latin1_General_CI_AI, 
  [table]     = QUOTENAME(referenced_schema_name) + ''.'' 
              + QUOTENAME(referenced_entity_name)
                COLLATE latin1_General_CI_AI,
  [column]    = QUOTENAME(referenced_minor_name)
                COLLATE latin1_General_CI_AI
FROM ' + QUOTENAME(name) + '.sys.schemas AS s
INNER JOIN ' + QUOTENAME(name) + '.sys.procedures AS p
ON s.[schema_id] = p.[schema_id]
CROSS APPLY ' + QUOTENAME(name) 
+ '.sys.dm_sql_referenced_entities'
+ '(QUOTENAME(s.name) + ''.'' + QUOTENAME(p.name), N''OBJECT'') AS d
WHERE d.referenced_minor_id > 0'
FROM sys.databases 
  WHERE database_id > 4 
  AND [state] = 0;

SET @sql = STUFF(@sql,1,11,'');

EXEC sp_executesql @sql;

CROSSAPPLY如果您的数据库处于80兼容模式,那么该语法也将不起作用。只要确保您没有在这样的数据库中执行代码,它就可以正常工作(即使某些目标数据库在80个数据库中)。

解决方法

有没有一种方法可以获取实例中所有数据库中所有存储过程中引用的所有列和表?输出应为:

Database   Procedure   Table   Column 
--------   ---------   -----   ------

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。