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 nahrazenasys.sql_dependencies
- Nová tabulka používá
object_id
místoid
- Nová tabulka používá
referenced_major_id
místodepid
- Nová tabulka používá
- 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
asys.procedures
- Poznámka :Tím se zabrání nutnosti kontrolovat, kde
o.xtype = 'p'
(atd.)
- Jak upozornil marc_s, místo toho použijte
-
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, coDISTINCT
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