2009-10-01 54 views
5

我有各種數據庫,以及確定我正在刪除真正孤兒的東西(在這種情況下是一個視圖)。是正確的SQL被使用:查找所有對於視圖的引用

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

的問題,那就是這些引用不會在存儲過程中拿起聲明,我不知道還有什麼。我發現SO Question我記得,但它也沒有幫助。此:

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

...已接近。我知道使用視圖的存儲過程的主體,但我無法獲取實際的過程名稱。

+0

「sp_depends」沒有幫助。 我想你必須在每個數據庫上運行它。 – AntDC 2016-07-18 11:52:08

回答

15

使用你只有一種選擇。

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

syscomments和INFORMATION_SCHEMA.routines具有nvarchar(4000)列。所以如果在位置3998使用「myViewName」,它將不會被找到。 syscomments確實有多行,但ROUTINES截斷。

+0

確保你也檢查任何/所有數據庫... – mmcrae 2016-11-03 17:38:32

0

您的方法不完全正確。閱讀這篇文章:如果另一種觀點認爲使用這種觀點

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

你的方法將不會返回任何結果。

SQL Server 2008具有特殊視圖(sys.dm_sql_referencing_entities),在這裏並不那麼容易。

+0

如果你想使用syscomments和獲取的對象名稱: SELECT OBJECT_NAME(t.id),T * FROM ŤSYSCOMMENTS WHERE CHARINDEX( 'V_MIEJSCE',t.text)> 0 – LukLed 2009-10-02 11:31:52

+0

@LukLed:我沒有」不想,只是想知道最好用什麼。根據千兆的答案,事實並非如此。 – 2009-10-02 16:23:54

0

我不知道,但我想你可以使用這樣的事情,如果你的觀點在一些存儲過程

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

不適用於長碼... – gbn 2009-10-02 05:02:27

+0

@gbn:長碼錶示長存儲過程? – Nirlep 2009-10-02 15:46:53

+2

@Neil:文本列被截斷爲前4,000個字符,因此如果您正在查找的字符串不完全在4,000個字符的限制內,那麼SQL將返回一個錯誤否定。 – 2009-10-02 16:22:14