Двата отговора с най-голям брой гласове използват много отхвърлени таблици, които трябва да се избягват.
Ето един много по-чист начин да го направите.
Вземете всички таблици, от които зависи една съхранена процедура:
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