Điều này sẽ nhận được danh sách bạn đang theo dõi, tuy nhiên nó sẽ không giúp ích cho bạn nếu bạn có các tham chiếu cột như vậy được nhúng trong SQL động (và có thể không tìm thấy các tham chiếu dựa vào độ phân giải tên trì hoãn). SQL Server không phân tích cú pháp văn bản của thủ tục được lưu trữ để đưa ra đầu ra DMV.
Hãy thử ngay bây giờ với COLLATE
các điều khoản để giải quyết các trường hợp bạn có cơ sở dữ liệu trên cùng một máy chủ với các đối chiếu khác nhau.
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql += N'UNION ALL
SELECT
[database] = ''' + REPLACE(name, '''', '''''') + ''',
[procedure] = QUOTENAME(s.name) + ''.'' + QUOTENAME(p.name)
COLLATE Latin1_General_CI_AI,
[table] = QUOTENAME(referenced_schema_name) + ''.''
+ QUOTENAME(referenced_entity_name)
COLLATE Latin1_General_CI_AI,
[column] = QUOTENAME(referenced_minor_name)
COLLATE Latin1_General_CI_AI
FROM ' + QUOTENAME(name) + '.sys.schemas AS s
INNER JOIN ' + QUOTENAME(name) + '.sys.procedures AS p
ON s.[schema_id] = p.[schema_id]
CROSS APPLY ' + QUOTENAME(name)
+ '.sys.dm_sql_referenced_entities'
+ '(QUOTENAME(s.name) + ''.'' + QUOTENAME(p.name), N''OBJECT'') AS d
WHERE d.referenced_minor_id > 0'
FROM sys.databases
WHERE database_id > 4
AND [state] = 0;
SET @sql = STUFF(@sql,1,11,'');
EXEC sp_executesql @sql;
Ngoài ra, CROSS APPLY
cú pháp sẽ không hoạt động nếu bạn có cơ sở dữ liệu ở chế độ tương thích 80. Chỉ cần đảm bảo rằng bạn không thực thi mã trong cơ sở dữ liệu như vậy và nó sẽ hoạt động tốt (ngay cả khi một số cơ sở dữ liệu đích ở 80).