Това ще получи списъка, който търсите, но няма да ви помогне, ако имате такива препратки към колони, вградени в динамичен 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;
Също така CROSS APPLY
синтаксисът няма да работи, ако имате бази данни, които са в режим на съвместимост 80. Просто се уверете, че не изпълнявате кода в такава база данни и той трябва да работи добре (дори ако някои от целевите бази данни са в 80).