web-dev-qa-db-fra.com

Interroger le contenu des procédures stockées sur SQL Server

J'explore un système de base de données hérité et je connais très peu ses composants internes. Je voudrais trouver toutes les procédures stockées qui invoquent une autre procédure stockée A.

Comment faire au mieux cela?

Puis-je écrire quelque chose comme ce pseudocode:

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

Asp.TextualContent désigne le code SQL réel contenu dans le SP.

26
Ben
SELECT
    OBJECT_NAME(OBJECT_ID),
    definition
FROM
    sys.sql_modules
WHERE
    objectproperty(OBJECT_ID, 'IsProcedure') = 1
AND definition LIKE '%Foo%' 
47
Martin Smith

Pour 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
6
Bogdan Sahlean

Cette requête récupérera la définition textuelle des procédures stockées et filtrera à l'aide d'un caractère générique simple.

Pour 2000 (non testé, mais le IIRC est le bon tableau):

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

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

Pour 2005 et 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%'

Essayez cette seule déclaration peut résoudre votre problème.

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

ou

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