【问题标题】:Remove sp_executesql while executing a stored procedure using Entity Framework使用实体框架执行存储过程时删除 sp_executesql
【发布时间】:2016-11-24 21:09:56
【问题描述】:

当我使用实体框架执行存储过程时,它会生成以下语法:

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

我们的 DBA 对此类查询提出了担忧,并希望摆脱 sp_executesql。

查询应为:

exec test @CityIds=1

实体框架中有哪些不同的方法来实现这一点?

【问题讨论】:

  • 什么 DBA 表达了担忧?这是一个完全安全的参数化查询 - 有什么可抱怨的?我不知道有什么方法可以告诉 EF 改变这种行为.....
  • 我同意你的观点。但是 DBA 期望 sp_executesql 将该查询创建为动态查询,而这无助于缓存执行计划。是否有任何解决方法可以在没有动态查询的情况下创建它?
  • 这是不是动态查询!它只是一个简单的、正确参数化的标准 T-SQL 查询,它会被执行,并带有它的参数值。 没有,据我所知,在 EF 中没有什么可以“关闭”这种行为 - 毕竟执行 参数化查询是 普遍接受的最佳实践 针对 SQL Server
  • 有道理,感谢您的解释。只是想知道执行计划缓存点。对此有何意见?
  • 好吧,因为它是一个经过适当参数化的查询,它在计划缓存中的表现会非常好,并且可以在后续请求中重复使用——即使参数 values 改变 ....

标签: entity-framework


【解决方案1】:

在实体框架/ADO.net 中使用 sp_executesql 是有意的。据观察,有时在生成的 sql 中,似乎 EF 在直接执行查询和有时使用 sp_executesql 之间非常决定性。当有客户端参数化有助于重用一个参数化编译计划。当没有指定参数时,SQL Server 会尝试进行自动参数化,以帮助重用查询计划。

更多关于查询Parameterization这里和execution pattern的信息

希望下面的帖子能帮助您了解如何在 EF 中使用 EXEC 而不是 sp_executesql。

SQL Server Recognise SP_EXECUTESQL as object rather than Procedure Name

【讨论】:

    猜你喜欢
    • 2013-10-31
    • 2016-12-28
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多