有没有一种方法可以获取实例中所有数据库中所有存储过程中引用的所有列和表?输出应为:
Database Procedure Table Column -------- --------- ----- ------
这将得到您想要的列表,但是,如果您在动态SQL中嵌入了此类列引用(并且可能找不到依赖于延迟名称解析的引用),则将无济于事。SQL Server不会解析存储过程的文本以提供DMV输出。
现在尝试使用COLLATE子句来处理在同一服务器上具有不同归类的数据库的情况。
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个数据库中)。
CROSSAPPLY