在我的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时,我会看到标题中提到的消息。是什么导致的?很多次我发生了这个错误,但我仍然不知道是什么导致
答案 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应该能够识别返回的列类型。