SQL Server 'Geçersiz sütun adı' bildiriyor, ancak sütun mevcut ve sorgu yönetim stüdyosu üzerinden çalışıyor


107

Biraz çıkmaza girdim. Bazı C#kodlar tarafından oluşturulan bir sorgum var . Sorgu Microsoft SQL Server Management Studioaynı veritabanında çalıştırıldığında sorunsuz çalışır .

Ancak kodum aynı sorguyu çalıştırmaya çalıştığında, geçersiz bir sütunla ilgili aynı hatayı alıyorum ve bir istisna atılıyor. Bu sütuna başvuran tüm sorgular başarısız oluyor.

Söz konusu sütun yakın zamanda veritabanına eklenmiştir. Adlı bir tarih sütunudur Incident_Begin_Time_ts.

Başarısız olan bir örnek:

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

Bu gibi diğer sorgular Select MAX(Incident_Being_Time_ts);, kodda çalıştırıldığında sütunun eksik olduğunu düşündüğü için başarısız olur.

Herhangi bir fikir?


Durumla ilgili bir sorun olabilir mi? Belki de Management Studio vakayı önemsemezken, veritabanına erişimin diğer yolları daha katıdır.
Oliver

1
Kodunuzda, Management Studio'dakiyle aynı veritabanını kullandığınızdan emin misiniz?
rlb.usa

3
C # 'da oluşturduğunuz sütun adının ve sorgulamaya çalıştığınız sütun adının tamamen aynı olduğundan emin misiniz? Sorunuzda, iki kez 'Olay _ Başlangıç _ Zaman_s' ve bir kez 'Olay _ Olma _ Zaman_t' yazıyorsunuz.
Christian Specht

1
@Oliver: büyük / küçük harf duyarlılığı bağlantı başına değildir. Veritabanı / sql sunucu seçeneği olarak.
Nicholas Carey

Yanıtlar:


65

Aynı ada sahip iki masanız olduğundan şüpheleniyorum. Biri 'dbo' ( dbo.PerfDiag) şemasına , diğeri ise SQL Server'a bağlanmak için kullanılan hesabın varsayılan şemasına aittir (buna benzer bir şey userid.PerfDiag).

Bir şema nesnesine (tablo gibi) niteliksiz bir başvurunuz olduğunda - şema adına göre nitelenmemiş bir başvuru - nesne başvurusu çözülmelidir. Ad çözümlemesi, belirtilen ada sahip uygun türdeki (tablo) bir nesneyi aşağıdaki sırayla arayarak gerçekleşir. İsim ilk eşleşmeye çözümlenir:

  • Kullanıcının varsayılan şeması altında.
  • Şema 'dbo' altında.

Niteliksiz referans, yukarıdaki sıradaki ilk eşleşmeye bağlanır.

Genel olarak önerilen bir uygulama olarak, performans nedenlerinden ötürü şema nesnelerine yapılan başvuruların her zaman nitelendirilmesi gerekir :

  • Niteliksiz bir başvuru, saklı yordam veya sorgu için önbelleğe alınmış bir yürütme planını geçersiz kılabilir, çünkü başvurunun bağlı olduğu şema, saklı yordamı veya sorguyu yürüten kimlik bilgilerine bağlı olarak değişebilir. Bu, bir performans düşüşü olan sorgu / saklı yordamın yeniden derlenmesine neden olur. Yeniden derlemeler, derleme kilitlerinin çıkarılmasına neden olarak başkalarının gerekli kaynaklara erişmesini engeller.

  • Nesnenin olası sürümüne ('dbo'ya ait olan) çözümlemek için iki araştırma yapılması gerektiğinden, ad çözümlemesi sorgu yürütmeyi yavaşlatır. Bu olağan durumdur. Tek bir araştırmanın adı çözeceği tek zaman, geçerli kullanıcının belirtilen ad ve tipte bir nesneye sahip olmasıdır.

[Daha fazla not için düzenlendi]

Diğer olasılıklar (belirli bir sırayla değil):

  • Olduğunu sandığın veri tabanına bağlı değilsin.
  • Olduğunu düşündüğünüz SQL Server örneğine bağlı değilsiniz.

Bağlantı dizelerinizi iki kez kontrol edin ve SQL Server örnek adını ve veritabanı adını açıkça belirttiklerinden emin olun.


4
+1 Bu tür sorunları takip etmek için sql profiler kullanıyorum. Diğer uygulamalardan dinamik sql ile her uğraştığınızda, sorguyu bir izleme ile yakalayın, kopyalayıp yeni bir sorgu penceresine yapıştırın, sorunun ne olduğunu bulmak için yürütü tıklayın. Bu aynı zamanda yukarıda önerildiği gibi doğru örneğe ve db'ye bağlandığınızı da doğrulayacaktır.
brian

2
... biraz konu dışı, ancak performans sorunlarını yeniden oluşturmak için profil oluşturucu kullanıyorsanız , tüm ayar seçeneklerini , özellikle sorguyu gerçekten çoğaltmak için ARITHABORT'u eklemeyi unutmayın (ve önbelleğe alınmış planı)
Nick.McDermaid

Önbelleği yeniden yüklemek için önce Ctrl + Shift + R ile deneyin. En kötü durumda, sadece birkaç saniyenizi boşa harcarsınız.
radbyx

267

Ctrl+ Shift+ Tuşlarına basın Rve bakın ...

SQL Server Management Studio'da Ctrl + Shift + R yerel önbelleği yeniler.


Bunu yapmanın neden yardımcı olacağını düşünüyorsun?
Dostane

7
SQL Server Management Studio'da Ctrl + Shift + R, Intellisense önbelleğini yeniler. Bu, Management Studio'nun eklediğim sütunların geçersiz olduğundan şikayet etmesini engelledi, ancak bunun bir kırmızı ringa balığı olduğunu düşünüyorum (bu yeni sütunlara koddan erişirken orijinal poster gibi hala bir sorun yaşıyorum).
Giles

2
Görünüşe göre her Göç Ekleme ve ardından Veritabanını Güncelle, bunu yapmam gerekiyor. Aksi takdirde MS SQL Server'da geçersiz bir sütun adı olduğunu anlıyorum. İşler! Çok teşekkürler.
BriOnH

1
Görünüşe göre bunu her tablo oluşturduğunuzda veya bu türden bir şey yapmanız gerekebilir.
Sonny Childs

1
Yukarıdaki, garip şeyler olduğunda normalde benim çözümümdür. Ancak bu durumda sorunu çözmedi. SQL Studio'yu yeniden başlatmak hile yaptı.
Dan Mehlqvist

9

Tabloyu düşürmeden / değiştirmeden önce bunu bir işlem ve bir SQL ifadesi içinde çalıştırıyorsanız, bu mesajı da alabilirsiniz.


1
+1. Bir tabloyu yeni bir sütun ekleyerek değiştirdim ve bu hatayı yeni sütuna başvuran bir sonraki ifadede alıyordum. Bunu, tablo değişikliğine kadar ifadeleri bir seferde ve sonra geri kalanını başka bir seferde çalıştırarak aştım. En büyük çözüm değil ama engelimi kaldırdım. :)
Prasad Korhale

3

Sonunda Microsoft SQL Server Management Studio'yu kapattım ve yeniden başlattım; ve bu benim için düzeltti. Ancak diğer zamanlarda, yeni bir sorgu penceresine başlamak yeterliydi.


2

Sütununuzla aynı ada sahip değişkenler kullanıyorsanız, '@' değişken işaretini unutmuş olabilirsiniz. INSERT deyiminde sütun olarak algılanacaktır.


2

Sadece aynı sorunu yaşadım. Aynı kodun başka bir bölümü tarafından daha sonra kullanılan geçici bir tablodaki bazı diğer adlandırılmış sütunları yeniden adlandırdım. Bazı nedenlerden dolayı, bu SQL Server Management Studio tarafından yakalanmadı ve geçersiz sütun adlarından şikayet etti.

Basitçe yaptığım şey yeni bir sorgu oluşturmak, eski sorgudan SQL kodunu kopyalayıp bu yeni sorguya yapıştırmak ve tekrar çalıştırmak. Bu, ortamı doğru bir şekilde yenilemiş gibiydi.


1

Benim durumumda Microsoft SQL Sunucu Management Studio'yu yeniden başlatıyorum ve bu benim için iyi çalışıyor.


0

Benim durumumda, birden çok SQL ifadesini sorgularken değeri yanlış ResultSet'ten almaya çalışıyordum.


0

Benim durumumda, sorun tuhaf bir önbelleğe alma sorunuydu. Yukarıdaki çözümler işe yaramadı.

Kodunuz düzgün çalışıyorsa ve tablolarınızdan birine bir sütun eklediyseniz ve 'geçersiz sütun adı' hatası veriyorsa ve yukarıdaki çözümler işe yaramıyorsa, şunu deneyin: Önce, değiştirileni oluşturmak için yalnızca kod bölümünü çalıştırın tablo ve ardından tüm kodu çalıştırın.


0

Bu yanıtı da dahil ettim çünkü bu, google'daki "geçersiz sütun adı sql" için en iyi sonuçtu ve bu yanıtı burada görmedim. Benim durumumda, Entity Framework C # kodumdaki .HasForeignKey ifademde yanlış kimlik kullandığım için Geçersiz Sütun Adı, Id1 alıyordum. Bunu .HasOne () nesnesinin kimliğiyle eşleşecek şekilde değiştirdiğimde, hata gitmişti.


0

Bir tablo değeri kullanarak bir skaler işlevi çalıştırırken bu hatayı aldım, ancak skaler işlevimdeki RETURN yan tümcesindeki Select deyiminde "FROM table" bölümü eksikti. : yüz parmakları:


0

Ayrıca, ConnectionString'i değiştirmeyi unuttuğunuzda ve yerel olarak yaptığınız değişiklikler hakkında hiçbir fikri olmayan bir tabloya sorduğunuzda da olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.