2014-07-17 55 views
4

我最近加入了我的团队中的一个项目。他们使用ASP.NET MVC和MS SQL以及实体框架作为ORM。为什么我们必须在存储过程中使用实体框架编写SET FMTONLY OFF

我注意到,每一个在EF使用的存储过程具有存储过程definitation

IF(0=1) SET FMTONLY OFF 

我认为这是一个很奇怪的状态开始这个公共线,所以我用Google搜索一下了一下并且问我的同事。他们说,当EF映射存储过程时,它将所有参数作为null发送,并跳过所有if循环。因此,它也将跳过IF(0=1)条件,然后SET FMTONLY OFF

上搜索SET FMTONLY OFF MSDN会说

只返回元数据到客户端。可以用于测试 响应的格式而不实际运行查询。

当你不控制数据库时,它会成为一个问题,你必须不断地告诉DBA添加它并一遍又一遍地向他们解释为什么首先需要它。

我仍然没有清楚的想法为什么这是必需的。如果有人能够详细解释一下这个问题,或者引导我进入一些涵盖了这个主题的链接,那么这对我来说就意味着这个世界。

+0

Microsoft已更新其页面SET FMTONLY: - 请勿使用此功能。此功能已被sp_describe_first_result_set(Transact-SQL),sp_describe_undeclared_pa​​rameters(Transact-SQL),sys.dm_exec_describe_first_result_set(Transact-SQL)和sys.dm_exec_describe_first_result_set_for_object(Transact-SQL)所取代。 – Mike

回答

3

为了能够使用设计器映射函数来表示代码中的存储过程,我暂时做了这些事情。问题是设计师默认将null传递给过程来确定模式。这有时会成为存储过程的一个问题,如果传递了null,那么会执行验证并抛出异常等。你所描述的设置可以解决这个问题,因为它返回的是元数据而不是实际的数据

2

我相信其原因与从SSRS运行的存储过程类似。总之,当FMTONLY处于活动状态时,您的存储过程可能会有一些意外的结果。因此明确地将其关闭的原因。有关详细信息,请参阅Dealing with the Evil of FMTONLY from SSRS