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 medsys.sql_dependencies
- Den nya tabellen använder
object_id
istället förid
- Den nya tabellen använder
referenced_major_id
istället fördepid
- Den nya tabellen använder
- Använda
sysobjects
bör ersättas med mer fokuserade systemkatalogvyer- Som marc_s påpekade, använd istället
sys.tables
ochsys.procedures
- Obs :Detta förhindrar att behöva kontrollera var
o.xtype = 'p'
(osv.)
- Som marc_s påpekade, använd istället
-
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 vadDISTINCT
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