Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

मैं संग्रहीत कार्यविधि में संदर्भित सभी स्तंभों की सूची कैसे प्राप्त कर सकता हूं?

जब एक संग्रहीत कार्यविधि को निष्पादित किया जाता है तो इसे पार्स किया जाता है और एक क्वेरी योजना में संकलित किया जाता है, इसे कैश किया जाता है और आप इसे XML प्रारूप में sys.dm_exec_cached_plans और sys.dm_exec_query_plan के माध्यम से एक्सेस कर सकते हैं। क्वेरी प्लान पार्स किए गए कोड के प्रत्येक अनुभाग की 'आउटपुट सूची' को रिकॉर्ड करता है। संग्रहीत कार्यविधि द्वारा कौन से कॉलम का उपयोग किया जाता है, यह देखना इस XML को क्वेरी करने का मामला है, जैसे:

--Execute the stored procedure to put its query plan in the cache
exec sys.sp_columns ''

DECLARE @TargetObject nvarchar(100) = 'sys.sp_columns';

WITH XMLNAMESPACES (
    'http://schemas.microsoft.com/sqlserver/2004/07/showplan' as ns1
), CompiledPlan AS (
    SELECT 
        (SELECT query_plan FROM sys.dm_exec_query_plan(cp.plan_handle)) qp,
        (SELECT ObjectID FROM sys.dm_exec_sql_text(cp.plan_handle)) ob
    FROM sys.dm_exec_cached_plans cp
    WHERE objtype = 'Proc'
), ColumnReferences AS (
    SELECT DISTINCT
        ob,
        p.query('.').value('./ns1:ColumnReference[1]/@Database', 'sysname') AS [Database],
        p.query('.').value('./ns1:ColumnReference[1]/@Schema', 'sysname') AS [Schema],
        p.query('.').value('./ns1:ColumnReference[1]/@Table', 'sysname') AS [Table],
        p.query('.').value('./ns1:ColumnReference[1]/@Column', 'sysname') AS [Column]
    FROM CompiledPlan
        CROSS APPLY qp.nodes('//ns1:ColumnReference') t(p)
)

SELECT 
    [Database], 
    [Schema], 
    [Table], 
    [Column]
FROM ColumnReferences 
WHERE 
    [Database] IS NOT NULL AND 
    ob = OBJECT_ID(@TargetObject, 'P')

चेतावनी देने वाला यह इस बात पर निर्भर करता है कि आप 'प्रयुक्त' को कैसे परिभाषित करते हैं। यह हो सकता है कि आपकी संग्रहीत प्रक्रिया के भीतर एक सीटीई एक तालिका से 5 कॉलम का संदर्भ देता है, लेकिन फिर जब इस सीटीई का उपयोग किया जाता है तो केवल तीन कॉलम ही पास होते हैं। क्वेरी अनुकूलक हो सकता है इन अतिरिक्त क्षेत्रों को अनदेखा करें और उन्हें योजना में शामिल न करें। दूसरी तरफ ऑप्टिमाइज़र यह तय कर सकता है कि यह आउटपुट में अतिरिक्त फ़ील्ड्स को शामिल करके अधिक कुशल क्वेरी बना सकता है ताकि बाद में इसे बेहतर इंडेक्स का उपयोग करने में सक्षम बनाया जा सके। यह कोड क्वेरी योजना द्वारा उपयोग किए गए कॉलम लौटाएगा, हो सकता है कि वे वास्तव में संग्रहीत प्रक्रिया कोड में मौजूद कॉलम न हों।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर Intellisense *कुछ* सर्वर पर काम नहीं कर रहा है

  2. सी # में बिगिंट के बराबर क्या है?

  3. जॉइन का उपयोग करके SQL सर्वर में 4 टेबल्स में शामिल होना

  4. SQL सर्वर (T-SQL) में 'दिनांक' को 'datetimeoffset' में बदलने के उदाहरण

  5. एक अस्थायी तालिका में कैसे सम्मिलित करें, जो कि RESTORE FILELISTONLY / HEADERONLY / VERIFYONLY द्वारा दी गई जानकारी है