sql >> Databasteknik >  >> RDS >> Sqlserver

Hur kan jag få listan över tabeller i den lagrade proceduren?

De två högst röstade svaren använder många föråldrade tabeller som bör undvikas.
Här är ett mycket renare sätt att göra det.

Hämta alla tabeller som en lagrad procedur beror på:

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

Fungerar med MS SQL SERVER 2005+

Lista över ändringar:

  • sysdepends bör ersättas med sys.sql_dependencies
    • Den nya tabellen använder object_id istället för id
    • Den nya tabellen använder referenced_major_id istället för depid
  • Använda sysobjects bör ersättas med mer fokuserade systemkatalogvyer
    • Som marc_s påpekade, använd istället sys.tables och sys.procedures
    • Obs :Detta förhindrar att behöva kontrollera var o.xtype = 'p' (osv.)
  • Dessutom finns det egentligen inget behov av en CTE som använder ROW_NUMBER() bara för att säkerställa att vi bara har en av varje rekorduppsättning returnerad. Det är vad DISTINCT finns till för!

    • Faktum är att SQL är smart nog att använda DISTINCT bakom kulisserna.
    • Jag lägger fram som bevis:Bilaga A . Följande frågor har samma exekveringsplan!

      -- 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. De 30 bästa intervjufrågorna för SQL-frågor du måste öva under 2022

  2. Jämför Oracle MySQL, Percona Server och MariaDB

  3. Genererar en serie datum

  4. oracle SQL hur man tar bort tid från datum