sql >> Base de Datos >  >> RDS >> Sqlserver

Enumere todas las columnas a las que se hace referencia en todos los procedimientos de todas las bases de datos

Esto obtendrá la lista que busca, sin embargo, no lo ayudará si tiene dichas referencias de columna incrustadas en SQL dinámico (y es posible que no encuentre referencias que se basen en la resolución de nombres diferidos). SQL Server no analiza el texto del procedimiento almacenado para obtener la salida del DMV.

Prueba ahora con COLLATE cláusulas para tratar casos en los que tiene bases de datos en el mismo servidor con diferentes intercalaciones.

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;

También el CROSS APPLY la sintaxis no funcionará si tiene bases de datos que están en modo de compatibilidad 80. Solo asegúrese de no ejecutar el código en dicha base de datos y debería funcionar bien (incluso si algunas de las bases de datos de destino están en 80).