Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Alle Spalten auflisten, auf die in allen Prozeduren aller Datenbanken verwiesen wird

Dadurch erhalten Sie die gesuchte Liste, es hilft Ihnen jedoch nicht, wenn Sie solche Spaltenreferenzen in dynamisches SQL eingebettet haben (und möglicherweise keine Referenzen finden, die auf verzögerter Namensauflösung beruhen). SQL Server analysiert den Text der gespeicherten Prozedur nicht, um die DMV-Ausgabe zu erhalten.

Probieren Sie es jetzt mit COLLATE aus Klauseln, um Fälle zu behandeln, in denen Sie Datenbanken auf demselben Server mit unterschiedlichen Sortierungen haben.

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;

Auch das CROSS APPLY Syntax funktioniert nicht, wenn Sie Datenbanken haben, die sich im 80-Kompatibilitätsmodus befinden. Stellen Sie nur sicher, dass Sie den Code nicht in einer solchen Datenbank ausführen und es sollte gut funktionieren (selbst wenn einige der Zieldatenbanken in 80 sind).