Tsql 实体框架4:所选存储过程不返回任何列

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中导

在我的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中导入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