Двата отговора с най-голям брой гласове използват много отхвърлени таблици, които трябва да се избягват.
Ето един много по-чист начин да го направите.
Вземете всички таблици, от които зависи една съхранена процедура:
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
Работи с MS SQL SERVER 2005+
Списък с промени:
sysdependsтрябва да бъде заменен сsys.sql_dependencies- Новата таблица използва
object_idвместоid - Новата таблица използва
referenced_major_idвместоdepid
- Новата таблица използва
- Използване на
sysobjectsтрябва да бъде заменен с по-фокусирани изгледи на системен каталог- Както marc_s посочи, вместо това използвайте
sys.tablesиsys.procedures - Забележка :Това предотвратява необходимостта от проверка къде
o.xtype = 'p'(и др.)
- Както marc_s посочи, вместо това използвайте
-
Освен това наистина няма нужда от CTE, който използва
ROW_NUMBER()само за да сме сигурни, че имаме върнат само един от всеки набор от записи. Това е, коетоDISTINCTима за!- Всъщност SQL е достатъчно умен, за да използва DISTINCT зад кулисите.
-
Представям като доказателство:Доказателство А . Следните заявки имат същия план за изпълнение!
-- 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