LINQ“无法检测到以下存储过程的返回类型”(不是临时表)

2024-02-29

长期潜伏者,第一次在这里发帖:)

我决定在这里问,因为我已经厌倦了在谷歌等搜索。将存储过程从 SQL 2005 DB 导入到网站(FW 4.0、C#)LINQ 项目时,我遇到此错误:

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

我有两个疑问。我想指出的是,我没有使用临时表。为了安全措施,这些查询仅在变量名称等中进行了编辑。无论如何,这是一个works:

ALTER PROCEDURE [dbo].[spMyWorkingProc]
@OS numeric
AS
BEGIN
SET NOCOUNT ON;

DECLARE @sql varchar(5000)

set @sql = '
        SELECT
        *
        FROM MYDB.dbo.MYVIEW 
        WHERE OS = ' + CONVERT(varchar, @OS)

EXEC('
SET NOCOUNT ON
SELECT * FROM
OPENROWSET(''SQLOLEDB'', ''MYDB''; ''user''; ''password'', ''' + @sql + ''')')

END

这是一个doesn't:

ALTER PROCEDURE [dbo].[spNotWorking]
@IDCLIENT int,
@PPNO char(10)
AS
BEGIN
SET NOCOUNT ON;

DECLARE @sql varchar(5000)

set @sql = '
        SELECT
        *
        FROM MYDB.dbo.MYOTHERVIEW
        WHERE ID = ' + CONVERT(VARCHAR, @IDCLIENT) + ' AND PASSPORTNO = ' + @PPNO + ' ORDER BY AGE'

EXEC('
SET NOCOUNT ON
SELECT * FROM
OPENROWSET(''SQLOLEDB'', ''MYDB''; ''user''; ''password'', ''' + @sql + ''')')  

END

这是我尝试过并发现的内容,以及一些注释和问题:

  • 两个用户(LINQ 和远程服务器)都是 db_owner。

  • 如果我只保留一个参数(无论是哪一个参数),则非工作存储过程就可以工作。如果我添加一个新的,它就不起作用了。

  • 如果我使用从任何表中简单的 select * 和两个或更多参数创建一个空 SP,它就可以工作(所以它没有意义)。

  • 假设问题出在 EXEC 中。如果是这样,第一个 SP 是如何工作的?好吧,那么问题就不存在了。 (我猜这就是逻辑告诉我的?)

  • 问题不在于视图,因为如果我使用在工作 SP 中访问的视图,它就不起作用。

  • 我需要使用提供的查询来执行此操作。我无法使用链接服务器或任何类似的东西,因为我们需要这样做才能连接到 6.5 数据库,并且它不能解决或解释为什么第一个 SP 有效而第二个 SP 无效,同时使用相同的方法。

  • 我尝试向工作 SP 添加一个参数(取自非工作 SP)并且它可以工作,所以它一定是第二个 SP 的参数,但我不知道是什么:/

  • 好的,如果我修改第二个 SP 并删除 @VAR 风格的参数并将它们硬编码到单个 @sql 变量中,它就可以完美工作。所以,我认为它一定是包含变量到动态查询(或其他东西)中。

我真的很抓狂,所以欢迎任何想法和建议!

提前致谢! - 黑暗家伙


ORM 代码生成工具,例如Linq2Sql函数导入通常使用以下命令运行您的存储过程显示计划_全部 http://msdn.microsoft.com/en-us/library/ms187735.aspx打开设置,而不实际执行过程,以便“嗅探”结果集。

正如您所发现的,这种方法对于动态 SQL 存在局限性,而且使用 TempDB 的过程或具有返回具有不同模式的数据的分支的过程也经常出现问题。

您的解决方案是一个很好的解决方案,即将真实的过程替换为硬编码的过程,但它返回代表实际数据的模拟数据。

Edit

我见过的解决此问题的另一种模式是将硬编码的“模式”结果嵌入到不可调用的条件中,如下所示:

ALTER PROCEDURE [dbo].[someProc]
AS
BEGIN
  SET NOCOUNT ON;
  IF (1 = 0)
    BEGIN
      -- "Cheat" the ORM resultset sniffing by returning an example of the schema.
      -- Casting and name aliasing to ensure the ORM derives the correct types
      SELECT CAST('Hello' AS NVARCHAR(50)) AS Name, CAST (1 AS BIT) AS IsOnline, ...
      RETURN;
    END
    .. rest of the REAL proc goes here
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LINQ“无法检测到以下存储过程的返回类型”(不是临时表) 的相关文章

随机推荐