SQL Server сообщает «Недопустимое имя столбца», но столбец присутствует, и запрос работает через студию управления


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);также не выполняются при запуске в коде, потому что он считает, что столбец отсутствует.

Любые идеи?


Может быть, проблема в чехле? Возможно, Management Studio не заботится о регистре, а другие способы доступа к базе данных более строгие.
Оливер

1
Вы уверены, что имеете дело с той же базой данных в коде, что и в Management Studio?
rlb.usa

3
Вы уверены, что имя столбца, созданное вами на C #, и имя столбца, которое вы пытаетесь запросить, совпадают? В своем вопросе вы дважды пишете «Инцидент _ Начало _ Время_ц» и один раз «Инцидент _ Бытие _ Время_время».
Кристиан Шпехт,

1
@Oliver: чувствительность к регистру не зависит от соединения. Это как опция сервера базы данных / sql.
Николас Кэри

Ответы:


65

Я подозреваю, что у вас есть две таблицы с одинаковым именем. Один принадлежит схеме 'dbo' ( dbo.PerfDiag), а другой принадлежит схеме по умолчанию учетной записи, используемой для подключения к SQL Server (что-то вроде userid.PerfDiag).

Если у вас есть неквалифицированная ссылка на объект схемы (например, таблица), не уточненная именем схемы, ссылка на объект должна быть разрешена. Разрешение имени происходит путем поиска в следующей последовательности объекта соответствующего типа (таблицы) с указанным именем. Имя разрешается до первого совпадения:

  • По стандартной схеме пользователя.
  • По схеме dbo.

Неквалифицированная ссылка привязана к первому совпадению в указанной выше последовательности.

В качестве общей рекомендуемой практики всегда следует квалифицировать ссылки на объекты схемы из соображений производительности:

  • Неквалифицированная ссылка может сделать недействительным кэшированный план выполнения для хранимой процедуры или запроса, поскольку схема, к которой была привязана ссылка, может измениться в зависимости от учетных данных, выполняющих хранимую процедуру или запрос. Это приводит к перекомпиляции запроса / хранимой процедуры, что снижает производительность. Перекомпиляция приводит к снятию блокировок компиляции, блокируя доступ других пользователей к необходимым ресурсам.

  • Разрешение имени замедляет выполнение запроса, так как необходимо выполнить две проверки для определения вероятной версии объекта (принадлежащего dbo). Это обычный случай. Единственный раз, когда один зонд разрешит имя, - это если текущий пользователь владеет объектом указанного имени и типа.

[Отредактировано для дальнейшего примечания]

Другие возможности (в произвольном порядке):

  • Вы не подключены к базе данных, о которой думаете.
  • Вы не подключены к тому экземпляру SQL Server, который вы думаете.

Дважды проверьте свои строки подключения и убедитесь, что они явно указывают имя экземпляра SQL Server и имя базы данных.


4
+1 Я использую профилировщик sql для отслеживания подобных проблем. Каждый раз, когда вы имеете дело с динамическим sql из других приложений, захватите запрос с трассировкой, скопируйте и вставьте его в новое окно запроса, нажмите «Выполнить», чтобы выяснить, что не так. Это также подтвердит, что вы подключаетесь к правильному экземпляру и базе данных, как было предложено выше.
Брайан

2
... немного не по теме, но если вы используете профилировщик для воспроизведения проблем с производительностью, не забудьте включить все установленные параметры , в частности ARITHABORT, чтобы действительно дублировать запрос (и его кешированный план)
Nick.McDermaid

Сначала попробуйте нажать Ctrl + Shift + R, чтобы перезагрузить кеш. В худшем случае вы потратите всего несколько секунд.
radbyx

267

Просто нажмите Ctrl+ Shift+ Rи посмотрите ...

В SQL Server Management Studio сочетание клавиш Ctrl + Shift + R обновляет локальный кеш.


Как вы думаете, почему это было бы полезно?
Amicable

7
В SQL Server Management Studio сочетание клавиш Ctrl + Shift + R обновляет кеш Intellisense. Это не позволило Management Studio жаловаться на то, что столбцы, которые я добавил, недействительны, но я думаю, что это было отвлекающим маневром (у меня все еще есть проблема, как и у исходного плаката, при доступе к этим новым столбцам из кода).
Джайлз

2
Кажется, каждый раз, когда я добавляю миграцию, а затем обновляю базу данных, я должен это делать. В противном случае я получаю, что это недопустимое имя столбца в MS SQL Server. Работает! Большое спасибо.
BriOnH 03

1
Похоже, вам придется делать это каждый раз, когда вы создаете таблицу или что-нибудь в этом роде.
Сонни Чайлдс,

1
Это обычно является моим решением, когда происходят странные вещи. Однако в данном случае это не решило проблему. Однако перезапуск SQL Studio помог.
Дэн Мельквист

9

Если вы запускаете это внутри транзакции и SQL-оператора до того, как это удалит / изменит таблицу, вы также можете получить это сообщение.


1
+1. Я изменил таблицу, добавив новый столбец, и получил эту ошибку в следующем утверждении, относящемся к новому столбцу. Я преодолел это, выполнив инструкции до изменения таблицы за один раз, а затем остальные за другой. Не самое лучшее решение, но разблокировало меня. :)
Прасад Корхале

3

В конце концов я выключил и перезапустил Microsoft SQL Server Management Studio; и это исправило это для меня. Но в других случаях было достаточно просто запустить новое окно запроса.


2

Если вы используете переменные с тем же именем, что и ваш столбец, возможно, вы забыли маркер переменной '@'. В операторе INSERT он будет обнаружен как столбец.


2

Была точно такая же проблема. Я переименовал некоторые столбцы с псевдонимами во временной таблице, которая в дальнейшем используется другой частью того же кода. По какой-то причине это не было зафиксировано SQL Server Management Studio, и она жаловалась на недопустимые имена столбцов.

Я просто создал новый запрос, скопировал и вставил код SQL из старого запроса в этот новый и запустил его снова. Это, казалось, правильно освежило окружающую среду.


1

В моем случае я перезапускаю Microsoft SQL Sever Management Studio, и у меня это хорошо работает.


0

В моем случае я пытался получить значение из неправильного ResultSet при запросе нескольких операторов SQL.


0

В моем случае проблема была в странной проблеме с кешированием. Приведенные выше решения не сработали.

Если ваш код работал нормально, и вы добавили столбец в одну из своих таблиц, и он дает ошибку «недопустимое имя столбца», а приведенные выше решения не работают, попробуйте следующее: сначала запустите только часть кода для создания этого измененного table, а затем запустите весь код.


0

Включая этот ответ, потому что это был лучший результат для "недопустимого имени столбца sql" в Google, и я не видел здесь этого ответа. В моем случае я получал Invalid Column Name, Id1, потому что я использовал неправильный идентификатор в моем операторе .HasForeignKey в моем коде Entity Framework C #. Как только я изменил его, чтобы он соответствовал идентификатору объекта .HasOne (), ошибка исчезла.


0

Я получил эту ошибку при запуске скалярной функции с использованием табличного значения, но в операторе Select в моем предложении RETURN скалярной функции отсутствовала часть «FROM table». : facepalms:


0

Также происходит, когда вы забываете изменить ConnectionString и запрашиваете таблицу, которая не знает, какие изменения вы вносите локально.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.