Hai câu trả lời được bình chọn cao nhất sử dụng nhiều bảng không được dùng nữa nên tránh.
Đây là một cách dễ dàng hơn để làm điều đó.
Nhận tất cả các bảng mà một thủ tục được lưu trữ phụ thuộc vào:
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
Hoạt động với MS SQL SERVER 2005+
Danh sách các thay đổi:
-
sysdepends
nên được thay thế bằngsys.sql_dependencies
- Bảng mới sử dụng
object_id
thay vìid
- Bảng mới sử dụng
referenced_major_id
thay vìdepid
- Bảng mới sử dụng
- Sử dụng
sysobjects
nên được thay thế bằng các chế độ xem danh mục hệ thống tập trung hơn- Như marc_s đã chỉ ra, thay vào đó hãy sử dụng
sys.tables
vàsys.procedures
- Lưu ý :Điều này tránh phải kiểm tra vị trí
o.xtype = 'p'
(v.v.)
- Như marc_s đã chỉ ra, thay vào đó hãy sử dụng
-
Ngoài ra, thực sự không cần CTE sử dụng
ROW_NUMBER()
chỉ để đảm bảo rằng chúng tôi chỉ có một trong mỗi tập hợp bản ghi được trả về. Đó là những gìDISTINCT
ở đó cho!- Trên thực tế, SQL đủ thông minh để sử dụng DISTINCT đằng sau hậu trường.
-
Tôi gửi bằng chứng: Phụ lục A . Các truy vấn sau có cùng một Kế hoạch thực thi!
-- 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