sql >> Database >  >> RDS >> Sqlserver

Hoe kan ik de lijst met tabellen in de opgeslagen procedure krijgen?

De twee meest gestemde antwoorden gebruiken veel verouderde tabellen die moeten worden vermeden.
Hier is een veel schonere manier om dit te doen.

Verkrijg alle tabellen waarvan een opgeslagen procedure afhankelijk is:

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

Werkt met MS SQL SERVER 2005+

Lijst met wijzigingen:

  • sysdepends moet worden vervangen door sys.sql_dependencies
    • De nieuwe tabel gebruikt object_id in plaats van id
    • De nieuwe tabel gebruikt referenced_major_id in plaats van depid
  • Gebruik sysobjects moet worden vervangen door meer gerichte systeemcatalogusweergaven
    • Zoals marc_s al aangaf, gebruik in plaats daarvan sys.tables en sys.procedures
    • Opmerking :Dit voorkomt dat u moet controleren waar o.xtype = 'p' (enz.)
  • Er is ook echt geen CTE nodig die gebruikmaakt van ROW_NUMBER() gewoon om er zeker van te zijn dat we slechts één van elke recordset terugkrijgen. Dat is wat DISTINCT is er voor!

    • SQL is zelfs slim genoeg om DISTINCT achter de schermen te gebruiken.
    • Ik dien als bewijs in:Bewijsstuk A . De volgende queries hebben hetzelfde uitvoeringsplan!

      -- 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. Wat zijn de voordelen van een datamanagementsysteem?

  2. MySQL InnoDB geeft geen schijfruimte vrij na het verwijderen van gegevensrijen uit de tabel

  3. De Chamilo MySQL-database implementeren voor hoge beschikbaarheid

  4. waarom kan ik deze tabel niet maken op Android SQLite?