带有临时表的存储过程,Entity Framework 更新存储过程不起作用 - SET FMTONLY OFF

Stored procedure with temporary tables, Entity Framework updating the stored procedure not working - SET FMTONLY OFF

我有一个包含多个临时表的存储过程,当我尝试在 Entity Framework 中导入它时,它没有创建复杂类型,我得到了这个错误:

The selected stored procedure or function returns no columns

当我用谷歌搜索时,我发现在存储过程中添加这段代码 SET FMTONLY OFF 会在我的 EDMX 中创建复杂类型。我做到了。

添加 SET FMTONLY OFF 后 Entity Framework 现在一切正常。

现在我的问题是,将这段代码添加到包含多个临时表的存储过程中是否存在安全威胁?

谢谢。

您不想只关闭 SET FMTONLY,因为这可能会产生意想不到的后果,但您可以 return 一个正确形状的空结果集,然后关闭 FMTONLY 并 RETURN在存储过程的开头。

例如

if 1=0  --this will only run in FMTONLY is ON
begin
  select cast(1 as decimal(12,0) a, cast('x' as nvarchar(20)) b -- . . .
  set fmtonly off
  return;
end

由于 FMTONLY 忽略控制流语句,它将 运行 begin/end 中的代码。客户端将得到一个空的结果集,然后程序就存在了。您必须关闭 FMTONLY,否则 return 将不会执行,稍后您的临时表会出错。

当此存储过程 运行 没有 FMTONLY 时,将计算 if 1=0,并跳过该块。

但是,当您更新 EF 模型时,将存储过程切换为没有临时表的存储过程是一种有效的替代方法。