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

Hvordan kan jeg få listen over tabeller i den lagrede procedure?

De to højest stemte svar bruger en masse forældede tabeller, som bør undgås.
Her er en meget renere måde at gøre det på.

Hent alle de tabeller, som en lagret procedure afhænger af:

SELECT DISTINCT p.name AS proc_name, t.name AS table_name
FROM sys.sql_dependencies d 
INNER JOIN sys.procedures p ON p.object_id = d.object_id
INNER JOIN sys.tables     t ON t.object_id = d.referenced_major_id
ORDER BY proc_name, table_name
 

Virkerer med MS SQL SERVER 2005+

Liste over ændringer:

  • sysdepends skal erstattes med sys.sql_dependencies
    • Den nye tabel bruger object_id i stedet for id
    • Den nye tabel bruger referenced_major_id i stedet for depid
  • Brug af sysobjects bør erstattes med mere fokuserede systemkatalogvisninger
    • Som marc_s påpegede, brug i stedet sys.tables og sys.procedures
    • Bemærk :Dette forhindrer at skulle kontrollere hvor o.xtype = 'p' (osv.)
  • Desuden er der virkelig ikke behov for en CTE, der bruger ROW_NUMBER() bare for at sikre, at vi kun har én af hvert rekordsæt returneret. Det er hvad DISTINCT er der for!

    • Faktisk er SQL smart nok til at bruge DISTINCT bag kulisserne.
    • Jeg fremlægger som bevis:Bilag A . Følgende forespørgsler har den samme eksekveringsplan!

      -- Complex WITH MyPeople AS ( SELECT id, name, ROW_NUMBER() OVER(PARTITION BY id, name ORDER BY id, name) AS row FROM People) SELECT id, name FROM MyPeople WHERE row = 1 -- Better SELECT DISTINCT id, name FROM People


  1. Inkrementel statistik indsamling i 11g

  2. Håndtering af primære nøglekonflikter ved indsættelse af data i SQLite

  3. Sådan får du optegnelser fra i dag i MySQL

  4. Betinget lead/lag funktion PostgreSQL?