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

я попал в тупик. У меня есть запрос, который генерируется какой-нибудь C# код. Запрос отлично работает в Microsoft SQL Server Management Studio при запуске с той же базой данных.

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

столбец, о котором идет речь, был недавно добавлен в базу данных. Это столбец даты под названием Incident_Begin_Time_ts .

An например, не является:

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

другие запросы, такие как Select MAX(Incident_Being_Time_ts); сбой при запуске в код, потому что он думает, что столбец отсутствует.

какие идеи?

7 ответов


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

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

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

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

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

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

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

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

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

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

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


нажмите Ctrl + Shift + R и видим...

в среде SQL Server Management Studio,Ctrl+Shift+R обновляет локальный кэш.


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


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


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

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


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


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