sql >> Databasteknik >  >> RDS >> Sqlserver

Lista alla kolumner som refereras till i alla procedurer i alla databaser

Detta kommer att få listan du letar efter, men det hjälper dig inte om du har sådana kolumnreferenser inbäddade i dynamisk SQL (och kanske inte hittar referenser som är beroende av uppskjuten namnupplösning). SQL Server analyserar inte texten i den lagrade proceduren för att komma med DMV-utdata.

Försök nu med COLLATE klausuler för att hantera fall där du har databaser på samma server med olika sorteringar.

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;

Även CROSS APPLY syntax fungerar inte om du har databaser som är i 80-kompatibilitetsläge. Se bara till att du inte kör koden i en sådan databas och det borde fungera bra (även om några av måldatabaserna är i 80).



  1. Skript för att skapa Mysql-användare

  2. MySql ger användartillstånd

  3. Ersätt alla fält i MySQL

  4. Oracle 10g:Kan CLOB-datalängder vara mindre än 4 000?