带有临时表的存储过程,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 模型时,将存储过程切换为没有临时表的存储过程是一种有效的替代方法。
我有一个包含多个临时表的存储过程,当我尝试在 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 模型时,将存储过程切换为没有临时表的存储过程是一种有效的替代方法。