我使用以下技术:
将存储过程拖动到数据模型中,并且存储过程返回OUTPUT参数时,它可以正常工作。但是,当存储过程返回使用动态SQL创建的结果集时,我收到以下错误:
“未知的返回类型,无法检测到以下存储过程的返回类型。”
如果存储过程不使用动态SQL,则可以正常工作。 (例如:表2中的SELECT column1)
但是,存储过程使用动态SQL查询指定视图的数据。以下简化以用于说明目的:
CREATE PROCEDURE GetViewData
@ViewName nvarchar(150)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Sql nvarchar(MAX)
SET @Sql = 'SELECT Column1, Column2, Column3 FROM' + @ViewName
EXEC sp_executesql @Sql
END
我可以将结果集放入临时表中,而不是直接返回结果集。然而,这会产生相同的错误。
根据Ritesh的文章,当将结果集放入表类型变量时,这应该可以解决问题,但是这在动态sql中是不可能的,因为范围仅在执行的动态sql中。
Ritesh的文章: http://riteshkk2000.blogspot.com/2010/08/error-unknown-return-type-return-types.html
经过进一步调查,我意识到LINQ to SQL收到的元数据不包含定义类型的必要信息。
显然,使用SQL 2012可以通过使用“WITH RESULTS SET”来手动实际定义元数据来解决这个问题。
答案 0 :(得分:1)
我通过创建另一个存储过程解决了这个问题,在不使用动态SQL的情况下调用GetViewData并填充表类型变量:
CREATE PROCEDURE CallGetViewData
@ViewName nvarchar(150)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ViewResultSet TABLE
(
column1 nvarchar(50),
column2 int,
column3 float
)
INSERT INTO @ViewResultSet
EXEC GetViewData @ViewName
SELECT column1, column2, column3 FROM @ViewResultSet
END
现在,当我将存储过程CallGetViewData拖入数据模型时,它会正确检测返回类型。
答案 1 :(得分:0)
您可以尝试的一个技巧是手动创建一个模型,该模型表示Stored Proc将返回的对象的形状。然后使用设计器,不要将proc拖到方法窗格中,而是将其拖放到手动创建的类型上。然后,LINQ to SQL将使用该类作为结果类型。
如果您已经为存储过程定义了方法,则可以使用F4属性窗口将返回类型更改为与您在模型中定义的结果形状匹配的任何类型。