Я попал в тупик. У меня есть запрос, который генерируется каким-то 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);
также не выполняются при запуске в коде, потому что он считает, что столбец отсутствует.
Любые идеи?
sql
sql-server
kidl33t
источник
источник
Ответы:
Я подозреваю, что у вас есть две таблицы с одинаковым именем. Один принадлежит схеме 'dbo' (
dbo.PerfDiag
), а другой принадлежит схеме по умолчанию учетной записи, используемой для подключения к SQL Server (что-то вродеuserid.PerfDiag
).Если у вас есть неквалифицированная ссылка на объект схемы (например, таблица), не уточненная именем схемы, ссылка на объект должна быть разрешена. Разрешение имени происходит путем поиска в следующей последовательности объекта соответствующего типа (таблицы) с указанным именем. Имя разрешается до первого совпадения:
Неквалифицированная ссылка привязана к первому совпадению в указанной выше последовательности.
В качестве общей рекомендуемой практики всегда следует квалифицировать ссылки на объекты схемы из соображений производительности:
Неквалифицированная ссылка может сделать недействительным кэшированный план выполнения для хранимой процедуры или запроса, поскольку схема, к которой была привязана ссылка, может измениться в зависимости от учетных данных, выполняющих хранимую процедуру или запрос. Это приводит к перекомпиляции запроса / хранимой процедуры, что снижает производительность. Перекомпиляция приводит к снятию блокировок компиляции, блокируя доступ других пользователей к необходимым ресурсам.
Разрешение имени замедляет выполнение запроса, так как необходимо выполнить две проверки для определения вероятной версии объекта (принадлежащего dbo). Это обычный случай. Единственный раз, когда один зонд разрешит имя, - это если текущий пользователь владеет объектом указанного имени и типа.
[Отредактировано для дальнейшего примечания]
Другие возможности (в произвольном порядке):
Дважды проверьте свои строки подключения и убедитесь, что они явно указывают имя экземпляра SQL Server и имя базы данных.
источник
Просто нажмите Ctrl+ Shift+ Rи посмотрите ...
В SQL Server Management Studio сочетание клавиш Ctrl + Shift + R обновляет локальный кеш.
источник
Если вы запускаете это внутри транзакции и SQL-оператора до того, как это удалит / изменит таблицу, вы также можете получить это сообщение.
источник
В конце концов я выключил и перезапустил Microsoft SQL Server Management Studio; и это исправило это для меня. Но в других случаях было достаточно просто запустить новое окно запроса.
источник
Если вы используете переменные с тем же именем, что и ваш столбец, возможно, вы забыли маркер переменной '@'. В операторе INSERT он будет обнаружен как столбец.
источник
Была точно такая же проблема. Я переименовал некоторые столбцы с псевдонимами во временной таблице, которая в дальнейшем используется другой частью того же кода. По какой-то причине это не было зафиксировано SQL Server Management Studio, и она жаловалась на недопустимые имена столбцов.
Я просто создал новый запрос, скопировал и вставил код SQL из старого запроса в этот новый и запустил его снова. Это, казалось, правильно освежило окружающую среду.
источник
В моем случае я перезапускаю Microsoft SQL Sever Management Studio, и у меня это хорошо работает.
источник
В моем случае я пытался получить значение из неправильного ResultSet при запросе нескольких операторов SQL.
источник
В моем случае проблема была в странной проблеме с кешированием. Приведенные выше решения не сработали.
Если ваш код работал нормально, и вы добавили столбец в одну из своих таблиц, и он дает ошибку «недопустимое имя столбца», а приведенные выше решения не работают, попробуйте следующее: сначала запустите только часть кода для создания этого измененного table, а затем запустите весь код.
источник
Включая этот ответ, потому что это был лучший результат для "недопустимого имени столбца sql" в Google, и я не видел здесь этого ответа. В моем случае я получал Invalid Column Name, Id1, потому что я использовал неправильный идентификатор в моем операторе .HasForeignKey в моем коде Entity Framework C #. Как только я изменил его, чтобы он соответствовал идентификатору объекта .HasOne (), ошибка исчезла.
источник
Я получил эту ошибку при запуске скалярной функции с использованием табличного значения, но в операторе Select в моем предложении RETURN скалярной функции отсутствовала часть «FROM table». : facepalms:
источник
Также происходит, когда вы забываете изменить ConnectionString и запрашиваете таблицу, которая не знает, какие изменения вы вносите локально.
источник