Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie kann ich die Liste der Tabellen in der gespeicherten Prozedur abrufen?

Die beiden am häufigsten bewerteten Antworten verwenden viele veraltete Tabellen, die vermieden werden sollten.
Hier ist ein viel saubererer Weg, dies zu tun.

Alle Tabellen abrufen, von denen eine gespeicherte Prozedur abhängt:

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

Funktioniert mit MS SQL SERVER 2005+

Liste der Änderungen:

  • sysdepends sollte durch sys.sql_dependencies ersetzt werden
    • Die neue Tabelle verwendet object_id statt id
    • Die neue Tabelle verwendet referenced_major_id statt depid
  • Verwendung von sysobjects sollte durch fokussiertere Systemkatalogansichten ersetzt werden
    • Wie marc_s betonte, verwenden Sie stattdessen sys.tables und sys.procedures
    • Hinweis :Dies verhindert, dass überprüft werden muss, wo o.xtype = 'p' (usw.)
  • Außerdem besteht wirklich keine Notwendigkeit für einen CTE, der ROW_NUMBER() verwendet nur um sicherzustellen, dass wir nur einen von jedem Datensatz zurückgegeben haben. Das ist DISTINCT ist da für!

    • Tatsächlich ist SQL intelligent genug, um DISTINCT hinter den Kulissen zu verwenden.
    • Ich lege als Beweismittel vor:Anlage A . Die folgenden Abfragen haben denselben Ausführungsplan!

      -- 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