Dwie najwyżej głosowane odpowiedzi wykorzystują wiele przestarzałych tabel, których należy unikać.
Oto znacznie czystszy sposób na zrobienie tego.
Pobierz wszystkie tabele, od których zależy procedura składowana:
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
Współpracuje z MS SQL SERVER 2005+
Lista zmian:
sysdependsnależy zastąpićsys.sql_dependencies- Nowa tabela używa
object_idzamiastid - Nowa tabela używa
referenced_major_idzamiastdepid
- Nowa tabela używa
- Korzystanie z
sysobjectsnależy zastąpić bardziej skoncentrowanymi widokami katalogu systemowego- Jak zauważył marc_s, zamiast tego użyj
sys.tablesisys.procedures - Uwaga :Zapobiega to konieczności sprawdzania, gdzie
o.xtype = 'p'(itp.)
- Jak zauważył marc_s, zamiast tego użyj
-
Ponadto naprawdę nie ma potrzeby stosowania CTE, które używa
ROW_NUMBER()tylko aby upewnić się, że zwrócono tylko jeden z każdego zestawu rekordów. To właśnieDISTINCTjest tam!- W rzeczywistości SQL jest wystarczająco inteligentny, aby używać DISTINCT za kulisami.
-
Przedstawiam dowody:Dowód A . Następujące zapytania mają ten sam plan wykonania!
-- 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