दो उच्चतम मत वाले उत्तरों में बहुत से पदावनत तालिकाओं का उपयोग किया जाता है जिनसे बचा जाना चाहिए।
इसे करने का एक अधिक साफ तरीका यहां दिया गया है।
उन सभी तालिकाओं को प्राप्त करें जिन पर संग्रहीत कार्यविधि निर्भर करती है:
SELECT DISTINCT p.name AS proc_name, t.name AS table_name
FROM sys.sql_dependencies d
INNER JOIN sys.procedures p ON p.object_id = d.object_id
INNER JOIN sys.tables t ON t.object_id = d.referenced_major_id
ORDER BY proc_name, table_name
एमएस एसक्यूएल सर्वर 2005+ के साथ काम करता है
परिवर्तनों की सूची:
sysdepends
sys.sql_dependencies
. से बदला जाना चाहिए- नई तालिका
object_id
uses का उपयोग करती हैid
. के बजाय - नई तालिका
referenced_major_id
. का उपयोग करती हैdepid
. के बजाय
- नई तालिका
sysobjects
का उपयोग करना अधिक केंद्रित सिस्टम कैटलॉग दृश्यों के साथ प्रतिस्थापित किया जाना चाहिए- जैसा कि marc_s ने बताया, इसके बजाय
sys.tables
. का उपयोग करें औरsys.procedures
- नोट :यह जांचने से रोकता है कि
o.xtype = 'p'
. कहां है (आदि)
- जैसा कि marc_s ने बताया, इसके बजाय
-
साथ ही, ऐसे सीटीई की वास्तव में कोई आवश्यकता नहीं है जो
ROW_NUMBER()
. का उपयोग करता हो बस यह सुनिश्चित करने के लिए कि हमारे पास लौटाए गए प्रत्येक रिकॉर्ड सेट में से केवल एक ही है। यही हैDISTINCT
के लिए है!- वास्तव में, SQL पर्दे के पीछे DISTINCT का उपयोग करने के लिए पर्याप्त स्मार्ट है।
-
मैं साक्ष्य के रूप में प्रस्तुत करता हूं:एक्ज़िबिट ए . निम्नलिखित प्रश्नों में समान निष्पादन योजना है!
-- Complex WITH MyPeople AS ( SELECT id, name, ROW_NUMBER() OVER(PARTITION BY id, name ORDER BY id, name) AS row FROM People) SELECT id, name FROM MyPeople WHERE row = 1 -- Better SELECT DISTINCT id, name FROM People