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:
sysdepends
należy zastąpićsys.sql_dependencies
- Nowa tabela używa
object_id
zamiastid
- Nowa tabela używa
referenced_major_id
zamiastdepid
- Nowa tabela używa
- Korzystanie z
sysobjects
należy zastąpić bardziej skoncentrowanymi widokami katalogu systemowego- Jak zauważył marc_s, zamiast tego użyj
sys.tables
isys.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śnieDISTINCT
jest 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