2011-10-07 12 views
17

Eksploruję system starszej bazy danych i mam bardzo małą wiedzę o jego składnikach wewnętrznych. Chciałbym znaleźć wszystkie procedury przechowywane, które odwołują się do innej procedury przechowywanej A.Sprawdzanie zawartości procedur składowanych na serwerze SQL Server

Jak najlepiej to zrobić?

Mogę napisać coś jak ta Pseudokod:

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

Asp.TextualContent oznacza rzeczywiste SQL zawartej w SP.

+0

jaka wersja SQL Server? –

+0

SQL Server 2005 – Ben

Odpowiedz

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

Niesamowita odpowiedź. Dzięki – Ben

+0

uratowałem moje życie! –

2

Ta kwerenda pobierze tekstową definicję procedur przechowywanych i filtrowanie za pomocą prostego wieloznacznego.

za rok 2000 (niesprawdzone, ale IIRC to właściwa tabela):

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%' 

Do roku 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%' 

W 2005 i 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' nie powinny być używane do tego, ponieważ dzieli definicje długie na 4 000 znaków, dzięki czemu można pominąć mecze, które przekraczają granice porcji. –

6

Dla 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

Spróbuj to tylko jedna instrukcja może rozwiązać swój problem ..

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

lub

SELECT @objname= OBJECT_DEFINITION(OBJECT_ID(N'dbo.myStoredProc')) 
print @objname 
Powiązane problemy