2009-10-01 39 views
5

Tôi có nhiều cơ sở dữ liệu khác nhau, và những gì để chắc chắn rằng tôi đang xóa thứ gì đó (xem trong trường hợp này) thực sự là mồ côi. Là SQL đúng để sử dụng:Tìm tất cả các tài liệu tham khảo để xem

SELECT r.routine_name, 
     r.routine_definition 
    FROM INFORMATION_SCHEMA.ROUTINES r 
WHERE r.routine_definition LIKE '%my_view_name%' 

Vấn đề với nó là những tài liệu tham khảo được không nhặt tờ khai trong thủ tục lưu trữ, và tôi không biết gì nữa.

Tôi tìm thấy số SO Question Tôi đã nhớ, nhưng cũng không giúp ích gì. Điều này:

SELECT t.* 
    FROM SYSCOMMENTS t 
WHERE CHARINDEX('my_view_name', t.text) > 0 

... đóng. Tôi nhận được cơ thể của các thủ tục được lưu trữ mà tôi biết là sử dụng xem, nhưng tôi gặp khó khăn khi nhận được tên thủ tục thực tế.

+0

Không "sp_depends" không trợ giúp. Tôi cho rằng bạn sẽ phải chạy nó trên mỗi cơ sở dữ liệu. – AntDC

Trả lời

15

Bạn có một lựa chọn duy nhất.

select 
    object_name(m.object_id), m.* 
from 
    sys.sql_modules m 
where 
    m.definition like N'%my_view_name%' 

cột syscomments và INFORMATION_SCHEMA.routines có nvarchar (4000). Vì vậy, nếu "myViewName" được sử dụng ở vị trí 3998, nó sẽ không được tìm thấy. syscomments không có nhiều dòng nhưng ROUTINES cắt ngắn.

+0

đảm bảo bạn cũng kiểm tra bất kỳ/tất cả cơ sở dữ liệu nào ... – mmcrae

0

Phương pháp của bạn không hoàn toàn chính xác. Đọc bài viết này:

http://www.mssqltips.com/tip.asp?tip=1294

phương pháp của bạn sẽ không trả về kết quả nào nếu nhìn khác sử dụng quan điểm này.

SQL Server 2008 có chế độ xem đặc biệt (sys.dm_sql_referencing_entities), ở đây không dễ dàng.

+0

Nếu bạn muốn sử dụng syscomments và nhận được tên đối tượng:. CHỌN object_name (t.id), t * TỪ SYSCOMMENTS t ĐÂU CHARINDEX ('V_MIEJSCE', t.text)> 0 – LukLed

+0

@LukLed: Tôi didn' Tôi muốn, chỉ muốn biết những gì tốt nhất để sử dụng. Câu trả lời của mỗi gbn, không phải vậy. –

0

Tôi không chắc chắn nhưng tôi đoán bạn có thể sử dụng một cái gì đó như thế này nếu tầm nhìn của bạn được sử dụng trong một số thủ tục lưu trữ

SELECT * 
FROM syscomments c 
INNER JOIN sysobjects o ON c.id =o.id 
WHERE text LIKE '%my_view_name%' AND xtype ='p' 
+0

không hoạt động đối với mã dài ... – gbn

+0

@gbn: Mã dài có nghĩa là thủ tục được lưu trữ lâu dài ??? – Nirlep

+2

@Neil: Cột văn bản được cắt ngắn thành 4.000 ký tự đầu tiên nên nếu chuỗi bạn đang tìm kiếm không hoàn toàn nằm trong giới hạn 4.000 ký tự đó, thì SQL sẽ trả về giá trị âm sai. –

Các vấn đề liên quan