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

Jak mohu získat seznam tabulek v uložené proceduře?

Dvě odpovědi s nejvyšším počtem hlasů používají mnoho zastaralých tabulek, kterým je třeba se vyhnout.
Zde je mnohem čistší způsob, jak to udělat.

Získejte všechny tabulky, na kterých závisí uložená procedura:

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

Funguje s MS SQL SERVER 2005+

Seznam změn:

  • sysdepends by měla být nahrazena sys.sql_dependencies
    • Nová tabulka používá object_id místo id
    • Nová tabulka používá referenced_major_id místo depid
  • Pomocí sysobjects by měl být nahrazen cílenějším zobrazením systémového katalogu
    • Jak upozornil marc_s, místo toho použijte sys.tables a sys.procedures
    • Poznámka :Tím se zabrání nutnosti kontrolovat, kde o.xtype = 'p' (atd.)
  • Také opravdu není potřeba CTE, který používá ROW_NUMBER() jen abychom se ujistili, že máme vrácen pouze jeden z každé sady záznamů. To je to, co DISTINCT je tu pro!

    • Ve skutečnosti je SQL dostatečně chytrý na to, aby používal DISTINCT v zákulisí.
    • Předkládám jako důkaz:Důkaz A . Následující dotazy mají stejný plán provádění!

      -- 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. Jak používat ALIAS v klauzuli ORDER BY PostgreSQL?

  2. Jaké jsou výhody spolupráce se společností na podporu přístupu?

  3. Příklady MONTH() v SQL Server (T-SQL)

  4. DB Control se blíží ke své smrti