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

时间:2010-12-17 19:16:35

标签: 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所以我确定查询没问题)

insert into @result
EXECUTE sp_executesql @TSQL

select * from @result

但是,当我尝试在VS 2010 Ultimate中导入taht SP时,我会看到标题中提到的消息。是什么导致的?很多次我发生了这个错误,但我仍然不知道是什么导致

2 个答案:

答案 0 :(得分:30)

尝试将此行添加到存储过程的开头:
SET FMTONLY OFF
完成导入后,您可以将其删除。

它在this article中提到过(有点长篇大论)并且它对我有用,虽然我在重新依赖存储过程的时候最终回到了ADO.NET。请记住,如果您的列根据动态SQL而发生变化,您的实体模型将会中断。

答案 1 :(得分:1)

我不确切知道你的返回类型是什么,但是如果你有一个有限(且相对较小)的返回类型,你可以创建一个用户定义的表类型并返回它。

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应该能够识别返回的列类型。