sql >> Databáze >  >> RDS >> Sqlserver

Seznam všech sloupců, na které se odkazuje ve všech procedurách všech databází

Tím získáte požadovaný seznam, ale nepomůže vám to, pokud máte takové odkazy na sloupce vložené do dynamického SQL (a nemusíte najít odkazy, které se spoléhají na odložený překlad názvů). SQL Server neanalyzuje text uložené procedury, aby vytvořil výstup DMV.

Zkuste to nyní pomocí COLLATE klauzule pro řešení případů, kdy máte databáze na stejném serveru s různým řazením.

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;

Také CROSS APPLY syntaxe nebude fungovat, pokud máte databáze, které jsou v režimu kompatibility 80. Jen se ujistěte, že kód v takové databázi nespouštíte a měla by fungovat dobře (i když některé z cílových databází jsou v 80).



  1. Tisk textu v okně Oracle SQL Developer SQL Worksheet

  2. Připojte datové rámce pandas na základě hodnot sloupců

  3. Použití INSERT s databází PostgreSQL pomocí Pythonu

  4. Data emodži načtená prostřednictvím připojení ODBC se zobrazí jako otazník