Tím získáte požadovaný seznam, ale nepomůže vám to, pokud máte takové odkazy na sloupce vložené do dynamického SQL (a nemusíte najít odkazy, které se spoléhají na odložený překlad názvů). SQL Server neanalyzuje text uložené procedury, aby vytvořil výstup DMV.
Zkuste to nyní pomocí COLLATE
klauzule pro řešení případů, kdy máte databáze na stejném serveru s různým řazením.
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;
Také CROSS APPLY
syntaxe nebude fungovat, pokud máte databáze, které jsou v režimu kompatibility 80. Jen se ujistěte, že kód v takové databázi nespouštíte a měla by fungovat dobře (i když některé z cílových databází jsou v 80).