Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Elenca tutte le colonne a cui si fa riferimento in tutte le procedure di tutti i database

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).