सभी संग्रहीत प्रक्रियाओं को सूचीबद्ध करने की क्वेरी


338

SQL सर्वर डेटाबेस में सभी संग्रहीत कार्यविधियों के नाम क्या क्वेरी वापस कर सकते हैं

यदि क्वेरी सिस्टम संग्रहीत कार्यविधियों को बाहर कर सकती है, तो यह और भी मददगार होगी।

जवाबों:


499

जैसा कि माइक ने कहा, इसका सबसे अच्छा तरीका उपयोग करना है information_schema। जब तक आप मास्टर डेटाबेस में नहीं होते हैं, सिस्टम संग्रहीत कार्यविधियाँ वापस नहीं की जाएंगी।

SELECT * 
  FROM DatabaseName.INFORMATION_SCHEMA.ROUTINES
 WHERE ROUTINE_TYPE = 'PROCEDURE'

यदि किसी कारण से आपके पास मास्टर डेटाबेस में गैर-सिस्टम संग्रहीत प्रक्रियाएँ थीं, तो आप क्वेरी का उपयोग कर सकते हैं (यह MOST सिस्टम प्रक्रियाओं को फ़िल्टर करेगा):

SELECT * 
  FROM [master].INFORMATION_SCHEMA.ROUTINES
 WHERE ROUTINE_TYPE = 'PROCEDURE' 
   AND LEFT(ROUTINE_NAME, 3) NOT IN ('sp_', 'xp_', 'ms_')

3
यदि आप डेटाबेस आरेख बनाते हैं, तो आपको अपने डेटाबेस में 'dt_' से शुरू होने वाले procs का एक गुच्छा मिल सकता है जिसे आप फ़िल्टर भी कर सकते हैं।
जॉन फोहि

सूचना स्कीमा के लिए +1। पढ़ने लायक: msdn.microsoft.com/en-us/library/ms186778.aspx
शिहैम

यह होना चाहिए "जब तक आप [मास्टर] या [msdb] डेटाबेस में नहीं होते, ..."
सोलोमन रटज़की

107
SELECT name, 
       type
  FROM dbo.sysobjects
 WHERE (type = 'P')

4
इसने मेरे लिए MS-SQL 2008 में एक साझा वातावरण में काम किया; पिछले दो नहीं ...
Realto619

3
SQL Server 2005 या नए का उपयोग करने वाला कोई भी व्यक्ति dbo.sys*विचारों से दूर जाना चाहिए । यह क्वेरी भी: सीएलआर संग्रहित प्रक्रियाओं को फ़िल्टर करती है, सिस्टम संग्रहीत प्रोक्स को फ़िल्टर नहीं करती है, और [प्रकार] तब वापस आती है जब यह ज्ञात हो जाता है कि [प्रकार] हमेशा out पी ’होगा क्योंकि यह WHERE की स्थिति है।
सोलोमन रटज़की

यह काम नहीं करेगा अगर डेटाबेस में वस्तुओं का अलग-अलग स्कीमा हो
Foyzul Karim

30

मेरी समझ से "पसंदीदा" विधि का उपयोग सूचना_समूह तालिकाओं का उपयोग करना है:

select * 
  from information_schema.routines 
 where routine_type = 'PROCEDURE'

लौटाए गए अभिलेखों में सिस्टम संग्रहीत कार्यविधियों में अंतर करने का एक तरीका नहीं है

18

निम्न चयनित डेटाबेस में सभी प्रक्रियाएँ लौटाएगा

SELECT * FROM sys.procedures

यह संशोधित हो गया है और तारीख आदि तैयार कर रहा है, जो बहुत उपयोगी है
ihightower

14

संग्रहीत कार्यविधियाँ और कार्य प्राप्त करने के लिए आप इस क्वेरी को आज़मा सकते हैं:

SELECT name, type
FROM dbo.sysobjects
WHERE type IN (
    'P', -- stored procedures
    'FN', -- scalar functions 
    'IF', -- inline table-valued functions
    'TF' -- table-valued functions
)
ORDER BY type, name

10

यदि आप SQL Server 2005 का उपयोग कर रहे हैं तो निम्नलिखित कार्य करेगा:

select *
  from sys.procedures
 where is_ms_shipped = 0

यह गलत परिणाम देगा और sql 2008 में आरेख संग्रहीत कार्यविधि (sp_upgraddiagrams) जैसी प्रणाली को शामिल करेगा
HaveNoDisplayName

@ पीयूष सच है कि यह आरेख प्रोक्स को वापस कर देगा, लेकिन कोई उन्हें मानक प्रणाली के साथ नहीं आने के कारण उन्हें "सिस्टम" प्रॉपर नहीं मान सकता है । ओपी ने निर्दिष्ट नहीं किया कि कैसे संभालना है ताकि उन्हें फ़िल्टर न करें यह जरूरी नहीं है कि गलत हो।
सोलोमन रटज़की 16

@srutzky: - लेकिन फिर भी ये sp उपयोगकर्ता द्वारा नहीं बनाए गए हैं
HaveNoDisplayName 16

@ पीयूष ट्रू, लेकिन जैसा कि मैंने कहा, ओपी ने यह नहीं बताया कि ऐसे प्रॉपर को कैसे हैंडल किया जाए जो न तो "यूजर क्रिएट" हो और न ही "सिस्टम"। और किसी ने पूछा नहीं।
सोलोमन रटज़की

बहुत बढ़िया जवाब। "Is_ms_shipped = 0." शामिल करने के लिए धन्यवाद
हंस वॉन

8

एक डेटाबेस में संग्रहीत प्रक्रियाओं की सूची खोजने के लिए आप नीचे दिए गए प्रश्नों में से एक का उपयोग कर सकते हैं:

प्रश्न 1:

    SELECT 
        *
    FROM sys.procedures;

प्रश्न 2:

    SELECT 
        * 
    FROM information_schema.routines 
    WHERE ROUTINE_TYPE = 'PROCEDURE' 

यदि आप सभी डेटाबेस में सभी एसपी की सूची खोजना चाहते हैं, तो आप नीचे दिए गए क्वेरी का उपयोग कर सकते हैं:

    CREATE TABLE #ListOfSPs 
    (
        DBName varchar(100), 
        [OBJECT_ID] INT,
        SPName varchar(100)
    )

    EXEC sp_msforeachdb 'USE [?]; INSERT INTO #ListOfSPs Select ''?'', Object_Id, Name FROM sys.procedures'

    SELECT 
        * 
    FROM #ListOfSPs

1
IMO आपका उदाहरण sp_msforeachdb का उपयोग करके सोना है और इसका उत्तर होना चाहिए। यहाँ एक लिंक है जो मैंने इस
स्पोक के

8

सभी संग्रहीत कार्यविधियाँ और दृश्य चुनें

select name,type,type_desc
from sys.objects
where type in ('V','P')
order by name,type

5

यह सिस्टम प्रक्रियाओं को छोड़कर प्रक्रिया को सूचीबद्ध करने में भी मदद कर सकता है:

select * from sys.all_objects where type='p' and is_ms_shipped=0

उपयोग करने का कोई कारण नहीं है sys.all_objectsक्योंकि आप फ़िल्टर कर रहे हैं is_ms_shipped=0। इसमें डीडीएल ट्रिगर शामिल हो सकते हैं, लेकिन जिन्हें फ़िल्टर किया जाएगा type='p'। आप भी उपयोग कर सकते हैं sys.objects
सोलोमन रटज़की 15

4

दुर्भाग्य से INFORMATION_SCHEMAसिस्टम procs के बारे में जानकारी शामिल नहीं है।

SELECT *
  FROM sys.objects
 WHERE objectproperty(object_id, N'IsMSShipped') = 0
   AND objectproperty(object_id, N'IsProcedure') = 1

1
इसके बजाय आप इसका उपयोग क्यों करेंगे sys.procedures where is_ms_shipped = 0? और objectproperty(object_id, N'IsMSShipped')जब आप हर पंक्ति के लिए कोई फ़ंक्शन चलाते हैं , तो एक फ़ील्ड is_ms_shippedहोता है जिसमें वह मान होता है? उन्हीं रेखाओं के साथ, वही कार्य फिर से क्यों चलता है [type] IN ('P', 'PC')? यह विधि अनावश्यक रूप से जटिल और अक्षम है।
सोलोमन रटज़की 16


3

मैंने सिस्टम संग्रहित प्रक्रियाओं को बाहर करने के लिए LostCajun की उत्कृष्ट पोस्ट को ट्विक किया है। मैंने "एक्सट्रेक्ट" भी हटा दिया। कोड से क्योंकि मैं यह पता नहीं लगा सका कि यह किस लिए है और इसने मुझे त्रुटियाँ दीं। लूप के अंदर "लाने वाले अगले" बयान को भी "खंड" खंड की आवश्यकता थी।

use <<databasename>>
go

declare @aQuery nvarchar(1024);
declare @spName nvarchar(64);
declare allSP cursor for
    select p.name  
    from sys.procedures p 
    where p.type_desc = 'SQL_STORED_PROCEDURE' 
    and LEFT(p.name,3) NOT IN ('sp_','xp_','ms_')
    order by p.name;
open allSP;
fetch next from allSP into @spName;
while (@@FETCH_STATUS = 0)
begin
    set @aQuery = 'sp_helptext [' + @spName + ']';
    exec sp_executesql @aQuery;
    fetch next from allSP into @spName;
end;
close allSP;
deallocate allSP;

2

वस्तुओं को प्राप्त करने का सर्वोत्तम तरीका sys.sql_modules है। आप इस तालिका से इच्छित प्रत्येक चीज़ पा सकते हैं और ऑब्जेक्ट_आईडी द्वारा अधिक जानकारी प्राप्त करने के लिए इस तालिका को अन्य तालिका से जोड़ सकते हैं

SELECT o. object_id,o.name AS name,o.type_desc,m.definition,schemas.name scheamaName
FROM sys.sql_modules        m 
    INNER JOIN sys.objects  o ON m.object_id=o.OBJECT_ID
    INNER JOIN sys.schemas ON schemas.schema_id = o.schema_id
    WHERE [TYPE]='p'

1
select *  
  from dbo.sysobjects
 where xtype = 'P'
   and status > 0

स्थिति> 0 सिस्टम संग्रहित प्रक्रियाओं और बनाए गए लोगों के बीच अंतर करने के लिए प्रतीत नहीं होता है

हम्म। यह हमारे लिए है - मुझे नहीं पता कि क्यों।
बॉब प्रोबस्ट

SQL Server 2005 या नए का उपयोग करने वाला कोई भी व्यक्ति dbo.sys*विचारों से दूर जाना चाहिए । यह क्वेरी सीएलआर संग्रहित प्रक्रियाओं को भी फ़िल्टर करती है।
सोलोमन रटज़की

1

मैंने सभी संग्रहीत प्रक्रियाओं के पाठ को सूचीबद्ध करने के लिए यह सरल tsql लिखा है। क्षेत्र में अपने डेटाबेस का नाम स्थानापन्न करना सुनिश्चित करें।

use << database name >>
go

declare @aQuery nvarchar(1024);
declare @spName nvarchar(64);
declare allSP cursor for
select p.name  from sys.procedures p where p.type_desc = 'SQL_STORED_PROCEDURE' order by p.name;
open allSP;
fetch next from allSP into @spName;
while (@@FETCH_STATUS = 0)
begin
    set @aQuery = 'sp_helptext [Extract.' + @spName + ']';
    exec sp_executesql @aQuery;
    fetch next from allSP;
end;
close allSP;
deallocate allSP;

कृपया देखें @BaffledBill का फिर से लिखना .. जो मेरे लिए काम करता है। यह काम नहीं किया क्योंकि इसमें बहुत सारी त्रुटियां थीं।
इहोवर

1

यह सिर्फ संग्रहीत प्रक्रियाओं के नाम देगा।

select specific_name
from information_schema.routines
where routine_type = 'PROCEDURE';

1

यह सभी संग्रहीत कार्यविधियाँ और कोड दिखाने वाला है:

select sch.name As [Schema], obj.name AS [Stored Procedure], code.definition AS [Code] from sys.objects as obj
    join sys.sql_modules as code on code.object_id = obj.object_id
    join sys.schemas as sch on sch.schema_id = obj.schema_id
    where obj.type = 'P'

0

यह, उन सभी चीजों को सूचीबद्ध करें जो आप चाहते हैं

Sql सर्वर 2005, 2008, 2012 में:

Use [YourDataBase]

EXEC sp_tables @table_type = "'PROCEDURE'" 
EXEC sp_tables @table_type = "'TABLE'"
EXEC sp_tables @table_type = "'VIEW'" 

या

SELECT * FROM information_schema.tables
SELECT * FROM information_schema.VIEWS

उपयोग करने, या उपयोग करने से लाभ होने का कोई कारण नहीं है sp_tables। इसके अलावा, "प्रक्रिया" के लिए एक वैध विकल्प नहीं है sp_tables। इसके लिए एकमात्र विकल्प @table_typeहैं: 'सिस्टम टेबल', 'टेबल' और 'व्यू'।
सोलोमन रटज़की

0

यह सभी सपा नाम लौटा देगा

Select * 
FROM sys.procedures where [type] = 'P' 
     AND is_ms_shipped = 0 
     AND [name] not like 'sp[_]%diagram%'

शर्त यह [type]होनी चाहिए कि [type] IN ('P', 'PC')आप किसी भी सीएलआर संग्रहित प्रोक्स को फ़िल्टर कर रहे हैं जो संभावित रूप से वहाँ हैं।
सोलोमन रुट्ज़की 16

0

इस कोडप्लेक्स लिंक को आज़माएं, यह उपयोगिता sql डेटाबेस से सभी संग्रहीत कार्यविधि को स्थानीय बनाने में मदद करती है।

https://exportmssqlproc.codeplex.com/


0
select * from DatabaseName.INFORMATION_SCHEMA.ROUTINES where routine_type = 'PROCEDURE'

select * from DatabaseName.INFORMATION_SCHEMA.ROUTINES where routine_type ='procedure' and left(ROUTINE_NAME,3) not in('sp_', 'xp_', 'ms_')


   SELECT name, type   FROM dbo.sysobjects
 WHERE (type = 'P')

0
USE DBNAME

select ROUTINE_NAME from information_schema.routines 
where routine_type = 'PROCEDURE'


GO 

यह mssql पर काम करेगा।


0

SQL सर्वर में संग्रहीत कार्यविधि की सूची का चयन करें। अधिक जानकारी के लिए यहां देखें: https://coderrooms.blogspot.com/2017/06/select-list-of-stored-procedure-in-sql.html


1
नमस्ते और आपका स्वागत है। यह कोड ऐसा नहीं करता है जो शीर्षक बताता है। यह केवल एक संग्रहीत प्रक्रिया बनाने के लिए प्रतीत होता है जो एक PaymentDetailsतालिका से रिकॉर्ड की सूची लौटाता है । ओपी वास्तविक संग्रहीत प्रक्रियाओं की एक सूची चाहता है।
जेरेमी कैनी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.