Что вызывает "Неправильный синтаксис около <имя хранимой процедуры>" в EF Code First и SQL 2005?

Примеры для метода System.Data.Entity.Database.SqlQuery, который, как я обнаружил, хорошо работают с SQL 2008 R2, но не работают с SQL 2005.

Этот вызов будет работать с SQL 2008 R2:

var myEntities = dbContext.Database.SqlQuery<MyEntity>("GetDataFromMySp @EntityId = {0}", entityId);

Однако в SQL 2005 этот оператор будет вызывать исключение SqlException с сообщением об ошибке "Неправильный синтаксис рядом с" GetDataFromMySp ".

Ответ 1

Решение, найденное самим @Dan (не может публиковать из-за rep)

Решение, которое я нашел для этой проблемы, было просто добавить к запросу ключевое слово "EXEC":

var myEntities = dbContext.Database.SqlQuery<MyEntity>("EXEC GetDataFromMySp @EntityId = {0}", entityId);

Это решение устранило проблему с SQL Server 2005 и все еще работало с SQL Server 2008 R2.

Ответ 2

Вам нужна только EXEC, если в пакете есть какие-либо утверждения до "GetDataFromMySp". Имя хранимой процедуры само по себе должно быть ОК.

Я бы запустил SQL Profiler, чтобы увидеть, что на самом деле отправляется EF.

Такие вещи, как "подготовленные заявления", выдает дополнительные команды как часть пакета в дополнение к вашему текстовому команду.

Смотрите это: http://social.msdn.microsoft.com/Forums/eu/adonetefx/thread/bae30a3d-7a66-4aff-af99-6426cf0483b5