Điều này sử dụng lược đồ thông tin cho cả bảng và các thủ tục được lưu trữ. Bạn có thể thay đổi hoặc loại bỏ điều kiện ROUTINE_TYPE để thêm các chức năng và bạn có thể thay đổi loại bảng để trả về các chế độ xem.
Câu trả lời này tạo ra kết quả của nó bằng cách kiểm tra các bảng mà một thủ tục được lưu trữ phụ thuộc vào. Tôi nghĩ rằng đây sẽ là một kết quả chính xác hơn nhiều, sau đó kiểm tra xem tên có trong văn bản truy vấn hay không. Nếu thủ tục tham chiếu đến một bảng trong phần nhận xét, thì kết quả này sẽ không được trả về trong truy vấn đầu tiên, nhưng sẽ có trong câu trả lời thứ hai và các câu trả lời khác được đưa ra.
SELECT t.TABLE_NAME, s.ROUTINE_NAME
FROM INFORMATION_SCHEMA.TABLES t
INNER JOIN INFORMATION_SCHEMA.ROUTINES s ON
s.ROUTINE_NAME IN (SELECT referencing_entity_name
FROM sys.dm_sql_referencing_entities(TABLE_SCHEMA + '.' + TABLE_NAME, 'OBJECT'))
AND s.ROUTINE_TYPE = 'PROCEDURE'
WHERE t.TABLE_TYPE = 'BASE TABLE'
chỉnh sửa :Đây là cách lấy các phụ thuộc mà không cần hàm. (Tôi thích phương pháp này nhất)
SELECT DISTINCT t.name [TableName], p.name [ProcedureName]
FROM sys.objects t
LEFT JOIN sys.sql_dependencies d ON
d.referenced_major_id = t.object_id
LEFT JOIN sys.objects p ON
p.object_id = d.object_id
AND p.type = 'p'
WHERE t.type = 'u'
Nếu mục đích sử dụng cụ thể của bạn là chỉ tìm bất kỳ chuỗi nào phù hợp với tên bảng, thì bên dưới sẽ hoạt động:
SELECT t.TABLE_NAME, s.ROUTINE_NAME
FROM INFORMATION_SCHEMA.TABLES t
INNER JOIN INFORMATION_SCHEMA.ROUTINES s
ON CHARINDEX(t.TABLE_NAME, s.ROUTINE_DEFINITION) > 0
AND s.ROUTINE_TYPE = 'PROCEDURE'
WHERE t.TABLE_TYPE = 'BASE TABLE'