Questo otterrà l'elenco che stai cercando, tuttavia non ti aiuterà se hai tali riferimenti di colonna incorporati in SQL dinamico (e potresti non trovare riferimenti che si basano sulla risoluzione dei nomi differita). SQL Server non analizza il testo della stored procedure per ottenere l'output DMV.
Prova ora con COLLATE
clausole per gestire i casi in cui hai database sullo stesso server con regole di confronto diverse.
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;
Anche il CROSS APPLY
la sintassi non funzionerà se si dispone di database in modalità di compatibilità 80. Assicurati solo di non eseguire il codice in un tale database e dovrebbe funzionare correttamente (anche se alcuni dei database di destinazione sono in 80).