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 83

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.