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

Я зашел в тупик. У меня есть запрос, который генерируется некоторым кодом 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

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

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

  • В соответствии со схемой по умолчанию пользователя.
  • В схеме "dbo" .

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

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

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

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

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

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

Ответ 9

В моем случае кажется, что проблема была странной проблемой кэширования. Вышеуказанные решения не сработали.

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

Ответ 10

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

Ответ 11

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