SQL सर्वर 'अमान्य स्तंभ नाम' की रिपोर्ट करता है, लेकिन स्तंभ मौजूद है और क्वेरी प्रबंधन स्टूडियो के माध्यम से काम करता है


107

मैं एक गतिरोध का एक सा मारा है। मेरे पास एक क्वेरी है जो कुछ C#कोड द्वारा बनाई गई है । Microsoft SQL Server Management Studioउसी डेटाबेस के विरुद्ध चलने पर क्वेरी ठीक काम करती है ।

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

विचाराधीन स्तंभ को हाल ही में डेटाबेस में जोड़ा गया था। यह एक तिथि स्तम्भ कहलाता है Incident_Begin_Time_ts

एक उदाहरण जो विफल रहता है:

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

अन्य प्रश्न जैसे Select MAX(Incident_Being_Time_ts);कोड में चलाते समय भी विफल हो जाते हैं क्योंकि यह सोचता है कि कॉलम गायब है।

कोई विचार?


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

1
क्या आप सुनिश्चित हैं कि आप अपने कोड में समान डेटाबेस के साथ प्रबंधन स्टूडियो में काम कर रहे हैं?
rlb.usa

3
क्या आप सुनिश्चित हैं कि आपने जो कॉलम नाम C # में बनाया है और जिस कॉलम का नाम आप क्वेरी करने का प्रयास करते हैं, वह बिल्कुल एक जैसा है? अपने प्रश्न में, आप दो बार 'हादसा _ शुरुआत _ Time_ts' और एक बार 'घटना _ बीइंग _ Time_ts' लिख रहे हैं।
क्रिश्चियन स्पीच

1
@ ओलिवर: केस-सेंसिटिविटी प्रति कनेक्शन नहीं है। यह एक डेटाबेस / एसक्यूएल सर्वर विकल्प के रूप में है।
निकोलस कैरी

जवाबों:


65

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

जब आपके पास स्कीमा ऑब्जेक्ट (जैसे तालिका) के लिए एक अयोग्य संदर्भ होता है - स्कीमा नाम से योग्य नहीं - ऑब्जेक्ट संदर्भ को हल किया जाना चाहिए। नाम रिज़ॉल्यूशन निर्दिष्ट क्रम में किसी निर्दिष्ट ऑब्जेक्ट (तालिका) के लिए निम्न क्रम में खोज करने से होता है। नाम पहले मैच में हल होता है:

  • उपयोगकर्ता के डिफ़ॉल्ट स्कीमा के तहत।
  • स्कीमा 'dbo' के तहत।

अयोग्य संदर्भ उपरोक्त अनुक्रम में पहले मैच के लिए बाध्य है।

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

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

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

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

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

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

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


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

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

कैश को पुनः लोड करने के लिए सबसे पहले Ctrl + Shift + R के साथ प्रयास करें। सबसे खराब स्थिति आप केवल कुछ सेकंड बर्बाद करते हैं।
मूलांक

267

बस प्रेस Ctrl+ Shift+ Rऔर देखें ...

SQL सर्वर प्रबंधन स्टूडियो में, Ctrl + Shift + R स्थानीय कैश को ताज़ा करता है।


आप ऐसा क्यों सोचते हैं जो मददगार होगा?
एमिकेबल

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

2
हर बार जब मैं ऐड-माइग्रेशन देखता हूं, तो डेटाबेस अपडेट करें, मुझे यह करना होगा। अन्यथा मुझे लगता है कि यह एमएस SQL ​​सर्वर में एक अमान्य स्तंभ नाम है। काम करता है! बहुत बहुत धन्यवाद।
बृहस्पति

1
ऐसा लगता है कि हर बार जब आप एक टेबल या उस तरह का कुछ भी बनाते हैं तो ऐसा करना पड़ सकता है।
सन्नी चिल्ड्स

1
जब अजीब चीजें होती हैं, तो यह सामान्य रूप से मेरा समाधान है। हालांकि इस मामले में यह समस्या हल नहीं हुई। SQL स्टूडियो को पुनरारंभ करने ने हालांकि चाल चली।
दान मेहलक्विस्ट

9

यदि आप इस ट्रांज़ेक्शन और SQL कथन के अंदर चल रहे हैं, तो इससे पहले कि आप इस संदेश को प्राप्त कर सकते हैं / छोड़ देती है।


1
+1। मैंने नए कॉलम में जोड़कर एक तालिका बदल दी थी और अगले कॉलम में नए कॉलम का संदर्भ देते हुए यह त्रुटि हो रही थी। मैं एक बार में तालिका परिवर्तन तक बयानों को निष्पादित करके और फिर दूसरे में बाकी को छोड़कर इस पर काबू पा लेता हूं। समाधान का सबसे बड़ा नहीं है, लेकिन मुझे मिला है। :)
प्रसाद कोरहले

3

मैंने अंततः Microsoft SQL सर्वर प्रबंधन स्टूडियो को शट-डाउन और पुनरारंभ किया; और यह मेरे लिए तय है। लेकिन अन्य समय में, बस एक नई क्वेरी विंडो शुरू करना पर्याप्त था।


2

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


2

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

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


1

मेरे मामले में मैं Microsoft SQL गंभीर प्रबंधन स्टूडियो को पुनः आरंभ करता हूं और यह मेरे लिए अच्छा काम करता है।


0

मेरे मामले में मैं कई SQL कथनों को उद्धृत करते समय गलत ResultSet से मान प्राप्त करने का प्रयास कर रहा था।


0

मेरे मामले में ऐसा लगता है कि समस्या एक अजीब कैशिंग समस्या थी। ऊपर दिए गए समाधान काम नहीं किए।

यदि आपका कोड ठीक काम कर रहा था और आपने अपनी किसी तालिका में एक कॉलम जोड़ा था और यह 'अमान्य कॉलम नाम' त्रुटि देता है, और ऊपर दिए गए समाधान काम नहीं करते हैं, तो यह प्रयास करें: पहले उस संशोधित बनाने के लिए केवल कोड का अनुभाग चलाएँ तालिका और फिर संपूर्ण कोड चलाएँ।


0

इस उत्तर को शामिल करना क्योंकि यह Google पर "अमान्य स्तंभ नाम sql" के लिए शीर्ष परिणाम था और मैंने इस उत्तर को यहां नहीं देखा। मेरे मामले में, मुझे अमान्य कॉलम नाम, Id1 मिल रहा था क्योंकि मैंने अपने .HasForeignKey स्टेटमेंट में अपने Entity Framework C # कोड में गलत आईडी का उपयोग किया था। एक बार जब मैंने इसे .HasOne () ऑब्जेक्ट के आईडी से मिलान करने के लिए बदल दिया, तो त्रुटि हो गई थी।


0

मैंने एक तालिका मान का उपयोग करके स्केलर फ़ंक्शन चलाते समय यह त्रुटि प्राप्त की है, लेकिन मेरे स्केलर फ़ंक्शन RETURN क्लॉज में चयन कथन "FROM तालिका" भाग को याद कर रहा था। : Facepalms:


0

ऐसा तब भी होता है जब आप ConnectionString को बदलना भूल जाते हैं और एक ऐसी तालिका पूछते हैं जिसमें आपके द्वारा स्थानीय स्तर पर किए जा रहे परिवर्तनों के बारे में कोई विचार नहीं होता है।

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