【问题标题】:Stored Procedure Return Type Can Not Be Detected无法检测存储过程返回类型
【发布时间】:2014-01-02 19:59:58
【问题描述】:

我正在尝试将此过程拖到 VS 2012 中的 dbml 中,但我收到了无法检测到返回类型的消息。

我已经尝试过这些: LINQ to SQL - Stored Procedure Return Type Error The return types for the following stored procedures could not be detected

我尝试将程序重写为 CTE 和联合以删除 OR,但它给了我相同的信息。

该方法的设计器属性中唯一的返回类型是 int32。

这是我的程序:

ALTER PROCEDURE [dbo].[GetStringFromFiles]
    @SearchWord NVARCHAR(100) = null
AS
BEGIN

    SET NOCOUNT ON
    SET @SearchWord = UPPER(@SearchWord);

Select    
       a.FileId     <---Guid
     , a.FileData   <---Binary
     , a.BaselineId <---Guid
     , a.FileName   <---NVARCHAR
     , a.FileExtension  <---NVARCHAR
     , b.FileByItemId   <----Guid
     , b.ItemId   <---Guid
From FileTable a

    Inner Join

     FileByItem b on a.FileId = b.FileId 

     WHERE CONTAINS(a.FileData,'FORMSOF(INFLECTIONAL, @SearchWord)') or FREETEXT(a.FileData, @SearchWord)
    RETURN 1
END

更新:

A.如果我注释掉整个 Where 子句,我可以添加它 -- Auto-Generated-ReturnType

B.如果我拿走 or 并只使用:

WHERE CONTAINS(a.FileData,'FORMSOF(INFLECTIONAL, @SearchWord)')

它让我添加它 -- Auto-Generated-ReturnType

C.如果我只是使用

WHERE FREETEXT(a.FileData, @SearchWord)

它抛出错误,所以它不喜欢 FREETEXT

如果我将 where 子句注释掉并添加它并让它生成返回类型然后更改数据库中的过程是否有任何问题?

【问题讨论】:

  • 你不能在最后删除多余的RETURN吗?
  • 它可能是返回的位置,将它移动到 WHERE 的右侧,看看是否有帮助。
  • 我更新了我的问题。它不喜欢 FREETEXT 出于某种原因
  • 您想通过添加RETURN 来完成什么?我的建议是要么完全忽略它,要么显式返回一个值(即RETURN 1)。

标签: c# sql sql-server linq linq-to-sql


【解决方案1】:

这有点相关。我今天偶然发现了同样的错误,但原因不同。如果您的查询在其结果中使用临时表,则无法自动分配返回类型。

我将其更改为表变量(性能不是主要问题/没有受到影响)

希望这对浏览的人有所帮助。

【讨论】:

    【解决方案2】:

    线

    RETURN 1
    

    是这两种情况的罪魁祸首。丢失它,Linq 应该能够检测到您的结果集的类型。

    Linq to Sql 不会直接从存储过程中获取结果。 相反,将返回一个 ISingleResult。你必须枚举 通过结果集获取存储返回的值 程序

    【讨论】:

    • 尝试使用简单的返回
    • 也试过了!它将采用 WHERE CONTAINS(a.FileData,'FORMSOF(INFLECTIONAL, @SearchWord)') 并自动解析返回类型。它不喜欢的是 FREETEXT()。
    【解决方案3】:

    如果存储过程也有任何错误,则可能会发生此错误,对我而言,它发生过一次,因为其中一个表名已更改。

    另一个因素是尽可能设置主键和表关系

    【讨论】:

      【解决方案4】:

      解决此问题的简单方法是(2019 年 12 月)

      • 只需在 #tmp 之前添加双 ## => ##tmp
      • 注释掉 DROP TABLE #tmp => --DROP TABLE #tmp
      • 执行存储过程
      • 再次拖动存储过程就可以了,它会生成返回类型
      • 最后,将您的商店恢复到第一种情况,然后保存。

      希望我能帮上忙。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-30
        相关资源
        最近更新 更多