SQL Server zgłasza „Nieprawidłowa nazwa kolumny”, ale kolumna jest obecna, a kwerenda działa przez Management Studio

107

Wpadłem w impas. Mam zapytanie, które jest generowane przez jakiś C#kod. Zapytanie działa dobrze, Microsoft SQL Server Management Studiogdy jest uruchamiane w tej samej bazie danych.

Jednak gdy mój kod próbuje uruchomić to samo zapytanie, pojawia się ten sam błąd dotyczący nieprawidłowej kolumny i zgłaszany jest wyjątek. Wszystkie zapytania odwołujące się do tej kolumny kończą się niepowodzeniem.

Kwestionowana kolumna została niedawno dodana do bazy danych. Jest to kolumna z datą o nazwie Incident_Begin_Time_ts.

Przykład, który się nie udaje:

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

Inne zapytania, takie jak Select MAX(Incident_Being_Time_ts);również kończą się niepowodzeniem, gdy są uruchamiane w kodzie, ponieważ uważa, że ​​brakuje kolumny.

Jakieś pomysły?

kidl33t
źródło
Czy to może problem z etui? Być może Management Studio nie dba o przypadek, podczas gdy inne sposoby dostępu do bazy danych są bardziej rygorystyczne.
Oliver
1
Czy na pewno masz do czynienia z tą samą bazą danych w swoim kodzie, co ta w Management Studio?
rlb.usa
3
Czy na pewno nazwa kolumny utworzona w C # i nazwa kolumny, do której próbujesz wykonać zapytanie, są dokładnie takie same? W swoim pytaniu piszesz dwukrotnie „Incydent _ Rozpocznij _ Czas_ts” i raz „Zdarzenie _ Bycie _ Czas_ts”.
Christian Specht
1
@Oliver: rozróżnianie wielkości liter nie dotyczy każdego połączenia. Jest to opcja serwera bazy danych / sql.
Nicholas Carey

Odpowiedzi:

65

Podejrzewam, że masz dwie tabele o tej samej nazwie. Jeden jest własnością schematu „dbo” ( dbo.PerfDiag), a drugi jest własnością domyślnego schematu konta używanego do łączenia się z serwerem SQL (coś w rodzaju userid.PerfDiag).

Jeśli masz niekwalifikowane odwołanie do obiektu schematu (takiego jak tabela) - takie, które nie jest kwalifikowane przez nazwę schematu - odwołanie do obiektu musi zostać rozwiązane. Rozpoznawanie nazw odbywa się poprzez wyszukiwanie w następującej kolejności obiektu odpowiedniego typu (tabeli) o określonej nazwie. Nazwa odnosi się do pierwszego dopasowania:

  • Zgodnie z domyślnym schematem użytkownika.
  • Zgodnie ze schematem „dbo”.

Niekwalifikowane odniesienie jest powiązane z pierwszym dopasowaniem w powyższej sekwencji.

Jako ogólną zalecaną praktykę należy zawsze kwalifikować odwołania do obiektów schematu, ze względu na wydajność:

  • Niekwalifikowane odwołanie może unieważnić buforowany plan wykonania procedury składowanej lub zapytania, ponieważ schemat, do którego odwołanie zostało powiązane, może ulec zmianie w zależności od poświadczeń wykonujących procedurę składowaną lub zapytanie. Powoduje to rekompilację kwerendy / procedury składowanej, wpływ na wydajność. Ponowna kompilacja powoduje usunięcie blokad kompilacji, uniemożliwiając innym dostęp do potrzebnych zasobów.

  • Rozpoznawanie nazw spowalnia wykonywanie zapytania, ponieważ należy wykonać dwie sondy, aby znaleźć prawdopodobną wersję obiektu (należącą do „dbo”). To jest zwykły przypadek. Jedynym przypadkiem, w którym pojedyncza sonda rozwiąże nazwę, jest sytuacja, gdy bieżący użytkownik jest właścicielem obiektu o określonej nazwie i typie.

[Zredagowano do dalszych uwag]

Inne możliwości to (w przypadkowej kolejności):

  • Nie masz połączenia z bazą danych, za którą myślisz, że jesteś.
  • Nie masz połączenia z instancją SQL Server, o której myślisz, że jesteś.

Dokładnie sprawdź ciągi połączeń i upewnij się, że jawnie określają nazwę wystąpienia programu SQL Server i nazwę bazy danych.

Nicholas Carey
źródło
4
+1 Używam profilera sql do śledzenia tego typu problemów. Za każdym razem, gdy masz do czynienia z dynamicznym sql z innych aplikacji, przechwyć zapytanie za pomocą śladu, skopiuj i wklej je do nowego okna zapytania, kliknij wykonaj, aby dowiedzieć się, co jest nie tak. Spowoduje to również sprawdzenie, czy łączysz się z właściwą instancją i bazą danych, jak zasugerowano powyżej.
brian
2
... nieco poza tematem, ale jeśli używasz profilera do odtwarzania problemów z wydajnością, pamiętaj o dołączeniu wszystkich ustawionych opcji , szczególnie ARITHABORT, aby naprawdę zduplikować zapytanie (i jego plan zapisany w pamięci podręcznej)
Nick.McDermaid
Najpierw spróbuj za pomocą Ctrl + Shift + R, aby ponownie załadować pamięć podręczną. W najgorszym przypadku tracisz tylko kilka sekund.
radbyx
267

Po prostu naciśnij Ctrl+ Shift+ Ri zobacz ...

W SQL Server Management Studio Ctrl + Shift + R odświeża lokalną pamięć podręczną.

Mangesh
źródło
Jak myślisz, dlaczego byłoby to pomocne?
Polubowne
7
W SQL Server Management Studio, Ctrl + Shift + R odświeża pamięć podręczną Intellisense. To powstrzymało Management Studio od narzekania, że ​​dodane przeze mnie kolumny są nieprawidłowe, ale myślę, że to był czerwony śledź (nadal mam problem, podobnie jak oryginalny plakat, podczas uzyskiwania dostępu do tych nowych kolumn z kodu).
Giles
2
Wydaje się, że za każdym razem, gdy dodaję migrację, a następnie aktualizuję bazę danych, muszę to zrobić. W przeciwnym razie otrzymuję, że jest to nieprawidłowa nazwa kolumny w MS SQL Server. Pracuje! Wielkie dzięki.
BriOnH
1
Wygląda na to, że będziesz musiał to robić za każdym razem, gdy tworzysz tabelę lub cokolwiek w tym rodzaju.
Sonny Childs
1
Powyższe jest zwykle moim rozwiązaniem, gdy pojawiają się dziwne rzeczy. W tym przypadku jednak nie rozwiązało to problemu. Jednak ponowne uruchomienie SQL Studio załatwiło sprawę.
Dan Mehlqvist
9

Jeśli wykonujesz to w ramach transakcji i instrukcja SQL przed usunięciem / zmianą tabeli, możesz również otrzymać ten komunikat.

Stagg
źródło
1
+1. Zmieniłem tabelę, dodając nową kolumnę i otrzymywałem ten błąd w następnej instrukcji odnoszącej się do nowej kolumny. Przezwyciężyłem to, wykonując instrukcje aż do zmiany tabeli za jednym razem, a resztę za drugim. Nie jest to najlepsze rozwiązanie, ale odblokowało mnie. :)
Prasad Korhale
3

Ostatecznie zamknąłem i ponownie uruchomiłem Microsoft SQL Server Management Studio; i to naprawiło to dla mnie. Ale w innych przypadkach wystarczyło samo rozpoczęcie nowego okna zapytania.

IAM_AL_X
źródło
2

Jeśli używasz zmiennych o tej samej nazwie co Twoja kolumna, może to oznaczać, że zapomniałeś znacznika zmiennej „@”. W instrukcji INSERT zostanie wykryty jako kolumna.

Dévan Coetzee
źródło
2

Miałem dokładnie ten sam problem. Zmieniłem nazwy niektórych kolumn z aliasami w tabeli tymczasowej, która jest dalej używana przez inną część tego samego kodu. Z jakiegoś powodu nie zostało to przechwycone przez SQL Server Management Studio i skarżyło się na nieprawidłowe nazwy kolumn.

Po prostu utworzyłem nowe zapytanie, skopiowałem wklej kod SQL ze starego zapytania do nowego zapytania i uruchomiłem je ponownie. Wydawało się, że poprawnie odświeżyło to środowisko.

Szarlotka
źródło
1

W moim przypadku ponownie uruchamiam Microsoft SQL Sever Management Studio i to działa dobrze dla mnie.

Rexhi
źródło
0

W moim przypadku próbowałem uzyskać wartość z niewłaściwego zestawu wyników podczas odpytywania wielu instrukcji SQL.

Deepak Kataria
źródło
0

W moim przypadku wydaje się, że problemem był dziwny problem z buforowaniem. Powyższe rozwiązania nie zadziałały.

Jeśli twój kod działał poprawnie i dodałeś kolumnę do jednej ze swoich tabel i daje to błąd `` nieprawidłowa nazwa kolumny '', a powyższe rozwiązania nie działają, spróbuj tego: Najpierw uruchom tylko sekcję kodu do utworzenia zmodyfikowanej table, a następnie uruchom cały kod.

LoMaPh
źródło
0

Uwzględniam tę odpowiedź, ponieważ był to najwyższy wynik dla zapytania „nieprawidłowa nazwa kolumny sql” w Google i nie widziałem tutaj tej odpowiedzi. W moim przypadku otrzymywałem nieprawidłową nazwę kolumny, Id1, ponieważ użyłem niewłaściwego identyfikatora w mojej instrukcji .HasForeignKey w moim kodzie Entity Framework C #. Gdy zmieniłem go, aby pasował do identyfikatora obiektu .HasOne (), błąd zniknął.

Daniel
źródło
0

Otrzymałem ten błąd podczas uruchamiania funkcji skalarnej przy użyciu wartości tabeli, ale w klauzuli Select w mojej funkcji skalarnej RETURN brakowało części „FROM table”. : facepalms:

cdabel
źródło
0

Dzieje się również, gdy zapomnisz zmienić ConnectionString i poprosisz tabelę, która nie ma pojęcia o zmianach, które wprowadzasz lokalnie.

Иво Недев
źródło