Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Listar todas as colunas referenciadas em todos os procedimentos de todos os bancos de dados


Isso obterá a lista que você procura, mas não o ajudará se você tiver essas referências de coluna incorporadas ao SQL dinâmico (e pode não encontrar referências que dependam da resolução de nomes adiada). O SQL Server não analisa o texto do procedimento armazenado para obter a saída DMV.

Experimente agora com COLLATE cláusulas para lidar com casos em que você tem bancos de dados no mesmo servidor com agrupamentos diferentes.
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;

Também o CROSS APPLY sintaxe não funcionará se você tiver bancos de dados que estão no modo de compatibilidade 80. Apenas certifique-se de não executar o código em tal banco de dados e ele deve funcionar bem (mesmo que alguns dos bancos de dados de destino estejam em 80).