我正在探索一個遺留數據庫系統,並且對其內部知識瞭解很少。我想找到所有調用另一個存儲過程A
的存儲過程。查詢SQL Server上存儲過程的內容
如何做到最好?
我可以寫這樣的僞代碼:
select name from AllStoredProcedures as Asp where Asp.TextualContent contains 'A'
Asp.TextualContent
指包含在SP的實際SQL。
我正在探索一個遺留數據庫系統,並且對其內部知識瞭解很少。我想找到所有調用另一個存儲過程A
的存儲過程。查詢SQL Server上存儲過程的內容
如何做到最好?
我可以寫這樣的僞代碼:
select name from AllStoredProcedures as Asp where Asp.TextualContent contains 'A'
Asp.TextualContent
指包含在SP的實際SQL。
SELECT
OBJECT_NAME(OBJECT_ID),
definition
FROM
sys.sql_modules
WHERE
objectproperty(OBJECT_ID, 'IsProcedure') = 1
AND definition LIKE '%Foo%'
真棒迴應。謝謝 – Ben
救了我的命! –
該查詢將檢索存儲過程的文本定義並使用簡單的通配符進行過濾。
在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%'
'sys.syscomments'不應該用於此,因爲它將長定義分割爲4,000個字符塊,因此您可能會錯過跨越塊邊界的匹配。 –
對於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
試試這個只有一個語句可以解決你的問題..
SELECT OBJECT_DEFINITION(OBJECT_ID(N'dbo.myStoredProc'))
或
SELECT @objname= OBJECT_DEFINITION(OBJECT_ID(N'dbo.myStoredProc'))
print @objname
的SQL Server的什麼版本? –
SQL Server 2005 – Ben