2011-08-31 19 views
72

के माध्यम से काम करता है मैं एक गतिरोध का एक सा पहुंच जाते हैं। मेरे पास एक प्रश्न है जो कुछ सी # कोड द्वारा उत्पन्न होता है। एक ही डेटाबेस के विरुद्ध चलाने पर क्वेरी Microsoft SQL Server प्रबंधन स्टूडियो में ठीक काम करती है।एसक्यूएल सर्वर रिपोर्ट 'अमान्य स्तंभ नाम', लेकिन स्तंभ मौजूद है और क्वेरी प्रबंधन स्टूडियो

हालांकि मेरे कोड एक ही क्वेरी मैं गलत स्तंभ के बारे में एक ही त्रुटि मिलती है चलाने के लिए कोशिश करता है और एक अपवाद फेंका जाता है। इस कॉलम का संदर्भ देने वाले सभी प्रश्न विफल हो रहे हैं।

प्रश्न में स्तंभ हाल ही में डेटाबेस के लिए जोड़ा गया है। यह Incident_Begin_Time_ts नामक एक दिनांक कॉलम है।

एक उदाहरण है कि विफल रहता है: जब कोड में चला क्योंकि यह सोचता है कि कॉलम उपलब्ध नहीं है

select * from PerfDiag 
where Incident_Begin_Time_ts > '2010-01-01 00:00:00'; 

Select MAX(Incident_Being_Time_ts); जैसे अन्य प्रश्नों भी असफल।

कोई भी विचार?

+0

क्या यह मामला शायद समस्या है? शायद प्रबंधन स्टूडियो को मामले की परवाह नहीं है, जबकि डेटाबेस तक पहुंचने के अन्य तरीके अधिक सख्त हैं। – Oliver

+1

क्या आप वाकई प्रबंधन कोड में से एक के रूप में अपने कोड में एक ही डेटाबेस से निपट रहे हैं? –

+1

क्या आप वाकई सी # में बनाए गए स्तंभ नाम और कॉलम नाम को क्वेरी करने का प्रयास करते हैं, वही हैं? आपके प्रश्न में, आप दो बार 'घटना _ ** प्रारंभ ** _ टाइम_ट्स' लिख रहे हैं और एक बार 'घटना _ ** होने के नाते ** _ टाइम_ट्स' लिख रहे हैं। –

उत्तर

49

मुझे लगता है आप ही नाम के दो टेबल है। एक स्कीमा 'dbo' (dbo.PerfDiag) के स्वामित्व में है, और अन्य एसक्यूएल सर्वर (userid.PerfDiag की तरह कुछ) से कनेक्ट करने के लिए प्रयोग किया जाता खाते का डिफ़ॉल्ट स्कीमा के स्वामित्व में है।

जब आपके पास स्कीमा ऑब्जेक्ट (जैसे तालिका) का अयोग्य संदर्भ है — स्कीमा नाम — द्वारा योग्य नहीं है ऑब्जेक्ट संदर्भ हल किया जाना चाहिए। निर्दिष्ट नाम के साथ उपयुक्त प्रकार (तालिका) के किसी ऑब्जेक्ट के लिए निम्न अनुक्रम में खोज करके नाम समाधान होता है। उपयोगकर्ता के डिफ़ॉल्ट स्कीमा के तहत

  • : नाम पहले मैच को हल करता है।
  • स्कीमा 'dbo' के तहत।

अयोग्य संदर्भ उपर्युक्त अनुक्रम में पहले मैच से जुड़ा हुआ है।

के रूप में एक सामान्य अभ्यास की सिफारिश की, एक हमेशा स्कीमा वस्तुओं के लिए संदर्भ में अर्हता प्राप्त करना चाहिए, प्रदर्शन कारणों से:

  • एक अयोग्य संदर्भ संग्रहीत प्रक्रिया या क्वेरी के लिए एक कैश्ड कार्य योजना लागू करके अमान्य हो सकती है, के बाद से स्कीमा जिस पर संदर्भ बाध्य था, संग्रहीत प्रक्रिया या क्वेरी निष्पादित करने वाले प्रमाण-पत्रों के आधार पर बदल सकता है। इसका परिणाम क्वेरी/संग्रहीत प्रक्रिया के पुनर्मूल्यांकन में होता है, एक प्रदर्शन हिट। पुनर्मूल्यांकन संकलन ताले को बाहर निकालने का कारण बनता है, जिससे दूसरों को आवश्यक संसाधनों तक पहुंचने से रोक दिया जाता है।

  • नाम संकल्प क्वेरी निष्पादन धीमा के रूप में दो जांच वस्तु ('dbo' के स्वामित्व में हैं) की संभावना संस्करण के लिए हल करने के लिए किया जाना चाहिए। यह सामान्य मामला है। एकमात्र बार एक ही जांच नाम को हल करेगी, यदि वर्तमान उपयोगकर्ता निर्दिष्ट नाम और प्रकार के ऑब्जेक्ट का मालिक है।

[आगे टिप्पणी करने के लिए संपादित]

अन्य संभावनाओं (किसी विशेष क्रम में) कर रहे हैं:

  • आप डेटाबेस आपको लगता है कि आप कर रहे हैं से जुड़े नहीं हैं।
  • आप SQL सर्वर इंस्टेंस से कनेक्ट नहीं हैं जो आपको लगता है कि आप हैं।

अपने कनेक्ट स्ट्रिंग को दो बार जांचें और सुनिश्चित करें कि वे स्पष्ट रूप से SQL सर्वर इंस्टेंस नाम और डेटाबेस नाम निर्दिष्ट करते हैं।

+4

+1 मैं इस प्रकार के मुद्दों को ट्रैक करने के लिए एसक्यूएल प्रोफाइलर का उपयोग करता हूं। जब भी आप अन्य अनुप्रयोगों से गतिशील एसक्यूएल से निपटते हैं, तो क्वेरी को एक ट्रेस के साथ कैप्चर करें, इसे एक नई क्वेरी विंडो में कॉपी और पेस्ट करें, यह जानने के लिए निष्पादित करें पर क्लिक करें कि क्या गलत है। यह भी सत्यापित करेगा कि आप ऊपर दिए गए अनुसार सही उदाहरण और डीबी से कनेक्ट कर रहे हैं। – brian

+2

... विषय से थोड़ा दूर है, लेकिन यदि आप प्रदर्शन समस्याओं को पुन: उत्पन्न करने के लिए प्रोफाइलर का उपयोग कर रहे हैं, तो ** सभी सेट विकल्प ** को शामिल करना याद रखें, विशेष रूप से ARITHABORT क्वेरी को वास्तव में डुप्लिकेट करने के लिए (और यह कैश योजना है) –

6

यदि आप इसे एक ट्रांजैक्शन के अंदर चला रहे हैं और इस बूंद से पहले एक SQL कथन तालिका में बदल जाता है तो आप यह संदेश भी प्राप्त कर सकते हैं।

158

बस Ctrl +शिफ्ट + आर और देखो ...

एसक्यूएल सर्वर प्रबंधन स्टूडियो में, प्रेस Ctrl+Shift+R refreshes the local cache.

+0

ऐसा क्यों लगता है सहायक होगा? – Amicable

+5

SQL सर्वर प्रबंधन स्टूडियो में, Ctrl + Shift + R इंटेलिसेंस कैश को रीफ्रेश करता है। इसने मैनेजमेंट स्टूडियो को यह शिकायत करने से रोक दिया कि मेरे द्वारा जोड़े गए कॉलम अमान्य हैं, लेकिन मुझे लगता है कि एक लाल-हेरिंग था (मुझे अभी भी एक समस्या है, मूल पोस्टर की तरह, कोड से इन नए कॉलम तक पहुंचने पर)। – Giles

+1

हर बार जब मैं एड-माइग्रेशन करता हूं, तो डेटाबेस अपडेट करें, मुझे यह करना है। अन्यथा मुझे लगता है कि यह एमएस एसक्यूएल सर्वर में एक अवैध कॉलम नाम है। काम करता है! बहुत बहुत धन्यवाद। – BriOnH

2

आप अपने स्तंभ के रूप में एक ही नाम के साथ चर का उपयोग कर रहे हैं, तो यह हो सकता है कि आप '@' वेरिएबल मार्कर भूल गए। एक आईएनएसईआरटी कथन में इसे एक कॉलम के रूप में पहचाना जाएगा।

0

बस एक ही समस्या थी। मैंने कुछ अबाध स्तंभों को एक अस्थायी तालिका में बदल दिया जिसका उपयोग उसी कोड के दूसरे भाग द्वारा किया जाता है। किसी कारण से, यह SQL सर्वर प्रबंधन स्टूडियो द्वारा कब्जा नहीं किया गया था और यह अवैध कॉलम नामों के बारे में शिकायत की गई थी।

जो मैंने अभी किया है वह एक नई क्वेरी बना रहा है, पुरानी क्वेरी से SQL कोड को इस नई क्वेरी में पेस्ट करें और इसे फिर से चलाएं। यह पर्यावरण को सही ढंग से ताज़ा करने लग रहा था।

संबंधित मुद्दे