2011-08-16 9 views
44

मुझे एहसास है कि अस्थायी सारणी सत्र/कनेक्शन बाध्य हैं और सत्र/कनेक्शन से दृश्यमान या सुलभ नहीं हैं।SQL सर्वर में सभी मौजूदा अस्थायी तालिकाओं की सूची प्राप्त करने का कोई तरीका है?

मेरे पास एक लंबी चल रही संग्रहीत प्रक्रिया है जो विभिन्न चरणों में अस्थायी तालिकाओं का निर्माण करती है।

क्या कोई तरीका है कि मैं वर्तमान अस्थायी तालिकाओं की सूची देख सकता हूं? ऐसा करने में सक्षम होने के लिए मुझे किन विशेषाधिकारों की आवश्यकता है?

वैकल्पिक रूप से,

वहाँ एक रास्ता मैं देख सकता हूँ विशेष SQL विवरण एक चल संग्रहीत प्रक्रिया के अंदर निष्पादित किया जा रहा है? प्रक्रिया SQL सर्वर में अनुसूचित नौकरी के रूप में चल रही है।

मैं एसक्यूएल सर्वर का उपयोग कर रहा 2000

आपके मार्गदर्शन के लिए धन्यवाद।

उत्तर

71

क्या यह आप के बाद क्या है?

select * from tempdb..sysobjects 
--for sql-server 2000 and later versions 

select * from tempdb.sys.objects 
--for sql-server 2005 and later versions 
+0

यह SQL Server 2000 में विफल रहता है। – AAsk

+12

2008 में: tempdb.sys .objects, 2000 में: tempdb..sysobjects –

+5

यह इंडेक्स और वैश्विक टेम्पलेट टेबल सहित tempdb में कई अलग-अलग ऑब्जेक्ट्स सूचीबद्ध करता है। उत्तर – FLICKER

2

यदि आपको अस्थायी तालिकाओं की सूची देखने की आवश्यकता है, तो आप बस उपयोग किए गए नामों को लॉग कर सकते हैं। (और जैसा कि अन्य ने ध्यान दिया है, इस जानकारी को सीधे पूछना संभव है)

यदि आपको अस्थायी तालिकाओं की सामग्री को देखने की आवश्यकता है, तो आपको एक (अद्वितीय) अस्थायी नाम के साथ वास्तविक तालिकाओं को बनाने की आवश्यकता होगी।

आप एसक्यूएल ट्रेस कर सकते हैं एसक्यूएल प्रोफाइलर का उपयोग कर निष्पादित किया जा रहा:

[ये लेख बाद में 2000 की तुलना में एसक्यूएल सर्वर वर्शन को लक्ष्य है, लेकिन के ज्यादा सलाह वही है।]

यदि आपके पास लंबी अवधि की प्रक्रिया है जो आपके व्यवसाय के लिए महत्वपूर्ण है, तो प्रक्रिया में विभिन्न चरणों (चरण का नाम/संख्या, प्रारंभ और समाप्ति समय) लॉग करना एक अच्छा विचार है। इस तरह जब आपके पास अच्छी तरह से प्रदर्शन नहीं होता है, तो आप तुलना करने के लिए आधारभूत आधार रखते हैं, और आप यह निर्धारित कर सकते हैं कि कौन से चरण समस्या को और अधिक तेज़ी से उत्पन्न कर रहे हैं।

+0

धन्यवाद। 'इस्तेमाल किए गए नामों को लॉग इन करें' के द्वारा, क्या मैं सोचने में सही हूं कि आप अस्थायी तालिका का नाम (सृजन के बाद) को दूसरी तालिका में लिखना चाहते हैं? – AAsk

+0

@AAsk: हाँ, यह एक संभावना है। क्या मैं पूछ सकता हूं कि आप वास्तव में क्या हल करने की कोशिश कर रहे हैं? क्या आपके पास कई अस्थायी टेबल हैं? –

+0

मेरे पास सप्ताह में एक बार रविवार को 3:00 बजे चलने वाली एक संग्रहीत प्रक्रिया होती है, आमतौर पर केवल 2 घंटे लगती है। पिछले रविवार को यह 6 घंटे तक चला और पूरा नहीं हुआ। मैं बिना बदलाव के इसे फिर से चला रहा हूं - इसलिए मेरा सवाल। यदि यह फिर से विफल हो जाता है, तो मैं 'डीबग' तालिका में महत्वपूर्ण चरणों में संदेश लिखूंगा ताकि मैं इसकी प्रगति देख सकूं। – AAsk

6

आप निम्न क्वेरी से अस्थायी तालिकाओं की सूची प्राप्त कर सकते हैं:

select left(name, charindex('_',name)-1) 
from tempdb..sysobjects 
where charindex('_',name) > 0 and 
xtype = 'u' and not object_id('tempdb..'+name) is null 
+0

के रूप में नहीं चुना जाना चाहिए बस एक टिप्पणी, मुझे आपका अंतिम खंड अधिक पढ़ने योग्य होगा क्योंकि 'और object_id (...) शून्य नहीं है –

+0

यह स्थायी सारणी भी देता है (जो स्पष्ट रूप से मेरे सत्र से संबंधित नहीं हो सकता है) । –

2

एसक्यूएल सर्वर 2000 के लिए, यह आप अपने सत्र में केवल #temp तालिकाओं में बताना चाहिए। (my example for more modern versions of SQL Server here से अनुकूलित।) यह मान लिया गया है कि आप लगातार तीन अंडरस्कोर, CREATE TABLE #foo___bar तरह के साथ अपने टेबल का नाम नहीं:

SELECT 
    name = SUBSTRING(t.name, 1, CHARINDEX('___', t.name)-1), 
    t.id 
FROM tempdb..sysobjects AS t 
WHERE t.name LIKE '#%[_][_][_]%' 
AND t.id = 
    OBJECT_ID('tempdb..' + SUBSTRING(t.name, 1, CHARINDEX('___', t.name)-1)); 
2
SELECT left(NAME, charindex('_', NAME) - 1) 
FROM tempdb..sysobjects 
WHERE NAME LIKE '#%' 
    AND NAME NOT LIKE '##%' 
    AND upper(xtype) = 'U' 
    AND NOT object_id('tempdb..' + NAME) IS NULL 

अगर आप वैश्विक अस्थायी तालिकाओं शामिल करना चाहते हैं ## लाइन निकाल सकते हैं।