2011-10-07 50 views
17

我正在探索一個遺留數據庫系統,並且對其內部知識瞭解很少。我想找到所有調用另一個存儲過程A的存儲過程。查詢SQL Server上存儲過程的內容

如何做到最好?

我可以寫這樣的僞代碼:

select name from AllStoredProcedures as Asp where Asp.TextualContent contains 'A' 

Asp.TextualContent指包含在SP的實際SQL。

+0

的SQL Server的什麼版本? –

+0

SQL Server 2005 – Ben

回答

37
SELECT 
    OBJECT_NAME(OBJECT_ID), 
    definition 
FROM 
    sys.sql_modules 
WHERE 
    objectproperty(OBJECT_ID, 'IsProcedure') = 1 
AND definition LIKE '%Foo%' 
+0

真棒迴應。謝謝 – Ben

+0

救了我的命! –

2

該查詢將檢索存儲過程的文本定義並使用簡單的通配符進行過濾。

在2000年(未經測試,但IIRC它的右表):

select p.[type] 
     ,p.[name] 
     ,c.[text] 
    from sysobjects p 
    join syscomments c 
    on p.object_id = c.id 
where p.[type] = 'P' 
    and c.[text] like '%foo%' 

爲2005:

select p.[type] 
     ,p.[name] 
     ,c.[text] 
    from sys.objects p 
    join sys.syscomments c 
    on p.object_id = c.id 
where p.[type] = 'P' 
    and c.[text] like '%foo%' 

2005和2008+

select p.[type] 
     ,p.[name] 
     ,c.[definition] 
    from sys.objects p 
    join sys.sql_modules c 
    on p.object_id = c.object_id 
where p.[type] = 'P' 
    and c.[definition] like '%foo%' 
+1

'sys.syscomments'不應該用於此,因爲它將長定義分割爲4,000個字符塊,因此您可能會錯過跨越塊邊界的匹配。 –

6

對於SQL Server 2005/2008:

SELECT s.name SchemaName 
     ,o.name RoutineName 
     ,o.[type] RoutineType 
     ,procs.* 
FROM sys.sql_modules procs 
INNER JOIN sys.objects o ON procs.object_id = o.object_id 
INNER JOIN sys.schemas s ON o.schema_id = s.schema_id 
WHERE procs.[definition] LIKE '%A%' 
--AND  o.[type] = 'P' --'P' for stored procedures 
1

試試這個只有一個語句可以解決你的問題..

SELECT OBJECT_DEFINITION(OBJECT_ID(N'dbo.myStoredProc')) 

SELECT @objname= OBJECT_DEFINITION(OBJECT_ID(N'dbo.myStoredProc')) 
print @objname