Esto obtendrá la lista que busca, sin embargo, no lo ayudará si tiene dichas referencias de columna incrustadas en SQL dinámico (y es posible que no encuentre referencias que se basen en la resolución de nombres diferidos). SQL Server no analiza el texto del procedimiento almacenado para obtener la salida del DMV.
Prueba ahora con COLLATE
cláusulas para tratar casos en los que tiene bases de datos en el mismo servidor con diferentes intercalaciones.
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;
También el CROSS APPLY
la sintaxis no funcionará si tiene bases de datos que están en modo de compatibilidad 80. Solo asegúrese de no ejecutar el código en dicha base de datos y debería funcionar bien (incluso si algunas de las bases de datos de destino están en 80).