किसी विशेष तालिका का संदर्भ देते हुए सभी संग्रहीत प्रक्रियाओं की पहचान कैसे करें


136

मैंने परीक्षण उद्देश्य के लिए विकास के माहौल पर एक तालिका बनाई और कुछ सपा हैं जो इस तालिका को वापस कर रहे हैं। अब मुझे इस तालिका को छोड़ना होगा और साथ ही सभी सपा की पहचान करनी होगी जो इस तालिका का उल्लेख कर रहे हैं। मुझे सभी एसपी की सूची खोजने में कठिनाई हो रही है। कृपया यह मानकर कुछ क्वेरी सुझाएं कि तालिका का नाम 'x' है और डेटाबेस sql सर्वर 2005 है।




1
विशेषज्ञों के लिए: कैसे एक गैर-एमएस SQL ​​सर्वर के लिए?
देवान

जवाबों:


259
SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%TableNameOrWhatever%'

BTW - यहाँ इस तरह के प्रश्न के लिए एक आसान संसाधन है: SQL सर्वर सिस्टम कैटलॉग FAQ का प्रश्न


3
वहाँ तक पहुँचने से अधिक यह करने के लिए किसी भी कारण है ROUTINE_DEFINITIONपर INFORMATION_SCHEMA.ROUTINES?
मैरी

1
@Marie - SQL-Server 2005 (AFAIK) में ऐसा नहीं है।
चेन

2
प्रश्न, क्या यह समाधान संदर्भित वस्तुओं को ढूंढता है जब वे एक स्ट्रिंग के अंदर संदर्भित होते हैं ? जैसे,set @Query = “SELECT * FROM Object_I_Need_To_Find_References…”;
जेफ। क्लार्क

1
@ Jeff.Clark - इसका पता लगाने का एक आसान तरीका है :-) - लेकिन हाँ, यह सीधे प्रक्रिया के पाठ को खोजता है, इसलिए यह पता चलेगा।
चेन

2
हाँ हाँ :) यह मुझे परीक्षण स्थापित करने में थोड़ी देर लगने वाली थी, और मैं सिर्फ एक आलसी / आसान उत्तर की तलाश में था :)
जेफ। क्लार्क

27

निम्नलिखित SQL2008 और इसके बाद के संस्करण पर काम करता है। संग्रहीत प्रक्रियाओं और कार्यों दोनों की एक सूची प्रदान करता है।

select distinct [Table Name] = o.Name, [Found In] = sp.Name, sp.type_desc
  from sys.objects o inner join sys.sql_expression_dependencies  sd on o.object_id = sd.referenced_id
                inner join sys.objects sp on sd.referencing_id = sp.object_id
                    and sp.type in ('P', 'FN')
  where o.name = 'YourTableName'
  order by sp.Name

1
ओपी को एसक्यूएल-सर्वर -2005 के लिए जवाब की आवश्यकता है
चेन

19

कभी-कभी उपरोक्त प्रश्न सही परिणाम नहीं देंगे, तालिका निर्भरता प्राप्त करने के लिए उपलब्ध संग्रहीत कार्यविधि में बनाया गया है:

EXEC sp_depends @objname = N'TableName';

1
मेरे लिए, यह ट्रिगर और दृश्य दिखाता है लेकिन संग्रहीत प्रोक्स नहीं है।
नीलवैलर्स

1
नोट: मैंने इसे एक ऐसी प्रणाली पर चलाया, जहां मुझे तालिकाओं तक पहुंच थी, लेकिन संग्रहीत प्रोक्स नहीं, इसलिए निश्चित रूप से परिणाम में संग्रहीत प्रोक्स दिखाई नहीं दिए।
नीलवैल्ट्स

18

एक गैर-क्वेरी तरीका Sql सर्वर प्रबंधन स्टूडियो का उपयोग करना होगा।

तालिका का पता लगाएँ, राइट क्लिक करें और "निर्भरताएँ देखें" चुनें।

संपादित करें

लेकिन, जैसा कि टिप्पणीकारों ने कहा, यह बहुत विश्वसनीय नहीं है।


4
2005 में निर्भरता की जानकारी अविश्वसनीय है अगर वस्तुओं को सही क्रम में नहीं बनाया गया है।
मार्टिन स्मिथ 15

3
जैसा कि @ मर्टिन स्मिथ ने उल्लेख किया है, एक गैर-मौजूद वस्तु को संदर्भित करने वाली एक संग्रहीत प्रक्रिया बनाई जाएगी, भले ही एक चेतावनी के साथ, लेकिन एंट्री को सिसडेपेंड में नहीं रखा जाएगा। इसके अलावा, एक विदेशी डेटाबेस में तालिका को संदर्भित करने वाली संग्रहीत प्रक्रियाओं के लिए भी यह सही है: किसी भी डेटाबेस में कोई प्रविष्टि कभी भी sysdepends में नहीं रखी जाती है। एंटेरो विशेषता यह है कि एक टेबल या दृश्य को छोड़ने / पुनः बनाने पर निर्भरता श्रृंखला टूट जाती है। ये ... इरेट ... फीचर्स SQL ​​सर्वर की निर्भरता ट्रैकिंग को बहुत बेकार बना देते हैं।
निकोलस कैरी

7

निम्न क्वेरी सभी संग्रहीत कार्यविधि नाम और उन SP की संबंधित परिभाषा को लाएगा

select 
   so.name, 
   text 
from 
   sysobjects so, 
   syscomments sc 
where 
   so.id = sc.id 
   and UPPER(text) like '%<TABLE NAME>%'

5
SELECT
    o.name
FROM
    sys.sql_modules sm
INNER JOIN sys.objects o ON
    o.object_id = sm.object_id
WHERE
    sm.definition LIKE '%<table name>%'

बस ध्यान रखें कि यह एसपी को भी बदल देगा जहां तालिका का नाम टिप्पणियों में है या जहां तालिका का नाम दूसरे तालिका नाम का एक विकल्प है जिसका उपयोग किया जा रहा है। उदाहरण के लिए, यदि आपके पास "परीक्षण" और "test_2" नाम की तालिकाएं हैं और आप "परीक्षण" के साथ एसपी की खोज करने की कोशिश करते हैं तो आपको दोनों के लिए परिणाम मिलेंगे।


2
syscommentsइस तरीके से क्वेरी करना लंबी प्रक्रियाओं के लिए विश्वसनीय नहीं है क्योंकि यह कई पंक्तियों में 4000 वर्ण विखंडू में परिभाषा को विभाजित करता है।sys.sql_modulesइससे बचता है।
मार्टिन स्मिथ 14

1
अच्छी बात। मैंने इसे उपयोग करने के लिए अद्यतन किया है sys.sql_modules
टॉम एच।

3
मेरे प्रत्येक दर्जन में से प्रत्येक में syscomments को विघटित किया गया है या एक ही प्रश्न के उत्तर stackoverflow.com/ ...
gbn

5

नीचे दी गई क्वेरी केवल तब काम करती है जब एक मेज पर निर्भरता की खोज की जाती है न कि किसी कॉलम पर:

EXEC sp_depends @objname = N'TableName';

हालाँकि, निम्न क्वेरी सबसे अच्छा विकल्प है यदि आप सभी प्रकार की निर्भरताओं की खोज करना चाहते हैं, तो यह किसी भी चीज़ को याद नहीं करता है। यह वास्तव में आवश्यकता से अधिक जानकारी देता है।

 select distinct
        so.name
        --, text 
  from 
       sysobjects so, 
       syscomments sc 
  where 
     so.id = sc.id 
     and lower(text) like '%organizationtypeid%'
  order by so.name

1
मेरे लिए, SSMS 2014 पर SQL Server 12.0 पर डेटाबेस के खिलाफ चल रहे कुछ भी नहीं लौटाया गया)
NealWalters

3
SELECT DISTINCT OBJECT_NAME(OBJECT_ID),
object_definition(OBJECT_ID)
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE '%' + 'table_name' + '%'

GO

यह काम करेगा यदि आपको टेबल का नाम बताना है।


3

प्रबंधन स्टूडियो में आप केवल टेबल पर राइट क्लिक कर 'डिपेंडेंसी देख सकते हैं' पर क्लिक करें यहाँ छवि विवरण दर्ज करें

की तुलना में आप उन वस्तुओं की सूची देख सकते हैं जिनमें आपकी तालिका के साथ निर्भरता है:यहाँ छवि विवरण दर्ज करें


1

आपके पास मूल रूप से 2 विकल्प हैं:

----विकल्प 1

SELECT DISTINCT so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '%tablename%'

----विकल्प 2

SELECT DISTINCT o.name, o.xtype
FROM syscomments c
INNER JOIN sysobjects o ON c.id=o.id
WHERE c.TEXT LIKE '%tablename%'

इन 2 प्रश्नों से आपको उन सभी संग्रहीत कार्यविधियाँ मिलेंगी जो आपके इच्छित तालिका का उल्लेख कर रही हैं। यह क्वेरी 2 sys टेबल पर निर्भर करती है जो sysobjects और syscomments हैं। Sysobjects वह जगह है जहाँ आपके DB ऑब्जेक्ट के सभी नाम संग्रहीत हैं इसमें संग्रहीत कार्यविधियाँ शामिल हैं।

Syscomments में आपकी सभी प्रक्रियाओं का पाठ होता है।

यदि आप क्वेरी करते हैं: चयन करें *

आपके पास एक तालिका होगी जिसमें आईडी होगी जो अंतिम कॉलम के रूप में संग्रहीत प्रक्रियाओं में निहित पाठ के साथ sysobjects तालिका के लिए मैपिंग है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.