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

Liste over alle kolonner, der henvises til i alle procedurer i alle databaser

Dette vil få den liste, du leder efter, men det hjælper dig ikke, hvis du har sådanne kolonnereferencer indlejret i dynamisk SQL (og måske ikke finder referencer, der er afhængige af udskudt navneopløsning). SQL Server analyserer ikke teksten i den lagrede procedure for at komme med DMV-outputtet.

Prøv nu med COLLATE klausuler til at håndtere tilfælde, hvor du har databaser på den samme server med forskellige sorteringer.

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;

Også CROSS APPLY syntaks vil ikke fungere, hvis du har databaser, der er i 80-kompatibilitetstilstand. Bare sørg for, at du ikke udfører koden i sådan en database, og den burde fungere fint (selvom nogle af måldatabaserne er i 80).



  1. Maksimering af databaseforespørgselseffektivitet for MySQL - Anden del

  2. MySQL:Kan ikke oprette tabel (fejlnr:150)

  3. PHP PDO hvordan kører man en anmodning om flere forespørgsler?

  4. PostgreSQL kolonne foo eksisterer ikke, hvor foo er værdien