Detta kommer att få listan du letar efter, men det hjälper dig inte om du har sådana kolumnreferenser inbäddade i dynamisk SQL (och kanske inte hittar referenser som är beroende av uppskjuten namnupplösning). SQL Server analyserar inte texten i den lagrade proceduren för att komma med DMV-utdata.
Försök nu med COLLATE
klausuler för att hantera fall där du har databaser på samma server med olika sorteringar.
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;
Även CROSS APPLY
syntax fungerar inte om du har databaser som är i 80-kompatibilitetsläge. Se bara till att du inte kör koden i en sådan databas och det borde fungera bra (även om några av måldatabaserna är i 80).