Tsql 实体框架4:所选存储过程不返回任何列
在我的SP中,我混合使用静态SQL和动态SQL:Tsql 实体框架4:所选存储过程不返回任何列,tsql,stored-procedures,entity-framework-4,Tsql,Stored Procedures,Entity Framework 4,在我的SP中,我混合使用静态SQL和动态SQL: declare @result table ( RowNum bigint, Id_and_Title varchar(max), DaysLeft int, cat_id int ); 然后,在动态SQL中,我将结果插入到该表中: DECLARE @TSQL NVARCHAR(max); SET @TSQL = ...... (我使用print@TSQL,因此我确信查询是正确的) 但是,当我尝试在VS 2010 Ultimate中导
declare @result table
(
RowNum bigint,
Id_and_Title varchar(max),
DaysLeft int,
cat_id int
);
然后,在动态SQL中,我将结果插入到该表中:
DECLARE @TSQL NVARCHAR(max);
SET @TSQL = ......
(我使用print@TSQL
,因此我确信查询是正确的)
但是,当我尝试在VS 2010 Ultimate中导入taht SP时,我看到了标题中提到的消息。是什么原因造成的?我已经多次出现此错误,但我仍然不知道是什么原因导致此错误。请尝试将此行添加到存储过程的开头:
设置FMTONLY OFF
您可以在完成导入后删除此项
它在(有点长的一段路要走)中提到过,它对我很有用,尽管我最终还是回到了ADO.NET,那时我非常依赖存储过程。请记住,如果您的列根据动态SQL而变化,您的实体模型将被破坏。我不知道您的返回类型是什么,但如果您的返回类型数量有限(且相对较少),则可以创建一个用户定义的表类型并返回该类型
CREATE TYPE T1 AS TABLE
( ID bigint NOT NULL
,Field1 varchar(max) COLLATE Latin1_General_CI_AI NOT NULL
,Field2 bit NOT NULL
,Field3 varchar(500) NOT NULL
);
GO
然后在程序中:
DECLARE @tempTable dbo.T1
INSERT @tempTable (ID, Field1, Field2, Field3)
SELECT .....
....
SELECT * FROM @tempTable
现在EF应该能够识别返回的列类型。在什么时候出现错误?当您“从数据库更新模型”时,或者当您创建函数导入时,或者当您创建复杂类型时……我从模型中删除SP,然后从数据库中更新它,当我导入SP时,我在动态SQL中得到错误,我使用我的函数,这会导致问题,但为什么?我一点也不知道…太棒了。文章链接现在对我不起作用,但我发现原因是select语句在执行之前不会得到计算,因此EF在添加导入时不会检测列。set fmtonly off强制发送列信息。这对我很有效。My proc从临时表返回select,EF无法获取列数据。非常感谢!
DECLARE @tempTable dbo.T1
INSERT @tempTable (ID, Field1, Field2, Field3)
SELECT .....
....
SELECT * FROM @tempTable