2016-05-19 3 views
0

Когда я выполнения хранимой процедуры с помощью Entity Framework, он генерирует ниже синтаксис:Удалить sp_executesql при выполнении хранимой процедуры с помощью Entity Framework

exec sp_executesql N'EXEC test @CityIds',N'@CityIds nvarchar(1)',@CityIds=N'1' 

Наша DBA поднял озабоченность этих рода запросов и хочет получить избавиться от sp_executesql.

Запрос должен гласить:

exec test @CityIds=1 

Что различные способы в рамках объекта для достижения этой цели?

+0

** ЧТО ** Означает ли это, что DBA? Это абсолютно безопасный **, параметризованный запрос - на что жаловаться? Я не знаю, как сказать EF, чтобы изменить это поведение ..... –

+0

Я согласен с вашей точкой. Но DBA ожидал, что sp_executesql создаст этот запрос как динамический запрос, и это не поможет в плане выполнения кеширования. Есть ли какое-нибудь обходное решение, где мы можем создать его без динамического запроса? –

+0

Это *** НЕ *** динамический запрос! Это простой, ** правильно параметризованный ** стандартный запрос T-SQL, который выполняется, с его значениями параметров. И ** нет **, насколько я знаю, в EF нет ничего, чтобы «отключить» это поведение - это, в конце концов, ** общепринятая Best Practice ** для выполнения ** параметризованных запросов ** против SQL Server –

ответ

1

Использование sp_executesql в сущностной структуре/ADO.net является намеренным. Наблюдалось, что иногда в сгенерированном sql оказалось, что EF был очень решающим между непосредственным выполнением запроса и иногда использованием sp_executesql.The sp_executesql вступает в игру, когда является параметризацией на стороне клиента, помогающей в повторном использовании одного параметризованного скомпилированного плана. Когда нет указанного параметра, SQL Server пытается выполнить автоматическую параметризацию, помогая повторно использовать план запроса.

Более подробная информация о запросе Parameterization здесь и execution pattern

Надежда ниже нить поможет вам о том, как использовать EXEC вместо sp_executesql с EF.

SQL Server Recognise SP_EXECUTESQL as object rather than Procedure Name

Смежные вопросы