2009-10-07 55 views
1

我想知道一個SP是否在任何地方被引用。目前我正在使用SP_DEPENDS進行檢查。如何找到SP參考

有沒有其他的方法來檢查這個...?

回答

0

嘗試:

SELECT OBJECT_NAME(m.object_id), m.* 
    FROM SYS.SQL_MODULES m 
WHERE m.definition LIKE N'%my_sp_name%' 

記住SYSCOMMENTS和INFORMATION_SCHEMA.ROUTINES必須爲nvarchar(4000)列。所以如果在位置3998使用my_sp_name,它將不會被找到。 SYSCOMMENTS確實有多行,但ROUTINES截斷。

參考:Listing SQL Server Object Dependencies

3

如果你的依賴被打破,我現在正在考慮是有信心的唯一方法是一個SQL文件導出所有的存儲過程定義,然後使用.sql文件內搜索依賴你最喜歡的源代碼編輯器。

0

我編寫了這個查詢來搜索所選字符串的「代碼對象」(包括過程,函數,觸發器,視圖,以及其他任何被暫停在sys.sql_modules中),無論是表,列,註釋還是存儲過程名稱。我有理由相信,這將解釋字符串在不同數據頁面上「分裂」的可能性。

返回的列有:

  • 擁有架構
  • 對象名稱
  • 對象類型(按照在sys.objects中type_desc)以字節爲單位
  • 代碼lenght(有時也有助於瞭解有多大代碼是)
  • 包含字符串的實際代碼

這將只列出字符串存在的對象。如果你搜索,說「聲明」,你可能會得到數據庫中的每個程序和功能。它也不會評估字符串的使用方式。如果您的程序名稱僅出現在另一程序的註釋中,則該程序將被列出。

總之,這是一個起點。它會列出您的字符串存在的位置;那麼你必須進入並審查每個案例,以確定它是如何使用的。

DECLARE @SearchText varchar(100) 

SET @SearchText = 'YourTextHere' 

SELECT 
    schema_name(ob.schema_id) SchemaName 
    ,ob.name 
    ,ob.type_desc 
    ,len(mo.definition) CodeLength 
    ,mo.definition 
from sys.sql_modules mo 
    inner join .sys.objects ob 
    on ob.object_id = mo.object_id 
where mo.definition like '%' + @SearchText + '%' 
order by 
    case schema_name(ob.schema_id) 
    when 'dbo' then 'A' 
    else 'B' + str(ob.schema_id, 10) 
    end 
    ,ob.type_desc 
    ,ob.name