2011-10-07 4 views
17

पर संग्रहित प्रक्रियाओं की सामग्री क्वेरी करें मैं एक विरासत डेटाबेस सिस्टम की खोज कर रहा हूं और इसके आंतरिकों का बहुत कम ज्ञान है। मैं उन सभी संग्रहीत प्रक्रियाओं को ढूंढना चाहता हूं जो एक और संग्रहीत प्रक्रिया A का आह्वान करते हैं।SQL सर्वर

यह कैसे करना सबसे अच्छा है?

मैं इस स्यूडोकोड की तरह कुछ लिख सकते हैं:

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

Asp.TextualContent वास्तविक एसक्यूएल में सपा निहित होता है।

+0

एसक्यूएल सर्वर के किन संस्करणों? –

+0

एसक्यूएल सर्वर 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 सर्वर 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