Ini akan mendapatkan daftar yang Anda cari, namun itu tidak akan membantu Anda jika Anda memiliki referensi kolom seperti itu yang disematkan dalam SQL dinamis (dan mungkin tidak menemukan referensi yang bergantung pada resolusi nama yang ditangguhkan). SQL Server tidak mengurai teks prosedur tersimpan untuk menghasilkan keluaran DMV.
Coba sekarang dengan COLLATE
klausa untuk menangani kasus di mana Anda memiliki database di server yang sama dengan susunan yang berbeda.
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;
Juga CROSS APPLY
sintaks tidak akan berfungsi jika Anda memiliki database yang berada dalam mode kompatibilitas 80. Pastikan Anda tidak mengeksekusi kode dalam database seperti itu dan kode tersebut akan berfungsi dengan baik (bahkan jika beberapa database target ada di 80).