C# 错误:未知返回类型,无法检测到以下存储过程的返回类型

C# 错误:未知返回类型,无法检测到以下存储过程的返回类型,c#,sql,linq-to-sql,C#,Sql,Linq To Sql,我正在使用以下技术: MS SQL 2008 R2 VisualStudio2010 Silverlight项目 LINQ到SQL 将存储过程拖动到数据模型中,并且该存储过程返回一个输出参数时,它工作正常。但是,当存储过程返回使用动态SQL创建的结果集时,我收到以下错误: “返回类型未知,无法检测到以下存储过程的返回类型。” 如果存储过程不使用动态SQL,则可以正常工作。 (例如:从表2中选择第1列) 但是,存储过程使用动态SQL查询数据的指定视图。为便于说明,简化如下: CREATE PROC

我正在使用以下技术:

  • MS SQL 2008 R2
  • VisualStudio2010
  • Silverlight项目
  • LINQ到SQL
  • 将存储过程拖动到数据模型中,并且该存储过程返回一个输出参数时,它工作正常。但是,当存储过程返回使用动态SQL创建的结果集时,我收到以下错误:

    “返回类型未知,无法检测到以下存储过程的返回类型。”

    如果存储过程不使用动态SQL,则可以正常工作。 (例如:从表2中选择第1列)

    但是,存储过程使用动态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的文章:

    经过进一步调查,我意识到LINQ to SQL接收的元数据不包含定义类型所需的信息


    显然,对于SQL 2012,这可以通过使用“with RESULTS SET”手动定义元数据来解决。

    我通过创建另一个存储过程来解决,在不使用动态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拖动到数据模型中时,它会正确地检测返回类型。

    您可以尝试的一个技巧是手动创建一个表示存储过程将返回的对象形状的模型。然后使用设计器,不要将过程拖到方法窗格中,而是将其放到手动创建的类型上。LINQtoSQL随后将使用该类作为结果类型

    如果已经为存储过程定义了方法,则可以使用F4属性窗口将返回类型更改为与在模型中定义的结果形状匹配的任何类型