Sql server a';的结果中不存在所需列;FromSql';操作:。FromSqlInterpolated

Sql server a';的结果中不存在所需列;FromSql';操作:。FromSqlInterpolated,sql-server,entity-framework-core,autorest,swashbuckle.aspnetcore,Sql Server,Entity Framework Core,Autorest,Swashbuckle.aspnetcore,[预演] 当我将api从.netcore2.1升级到.netcore3.1时,我发现我需要对我的实体框架代码进行大量修改 我没有意识到的是,我的远程数据库中的一个存储过程中有一个bug,它没有在我的.netcore2.1代码中表达出来 我遇到的错误消息并没有告诉我在存储过程内部进行检查的方向。我留下问题的最后形式,以防搜索错误消息对某人有所帮助 [问题] 我有以下代码来调用返回整数的存储过程 该代码在服务器端单元测试中工作,但在通过api或SwaggerUI调用时失败 var obj = con

[预演]

当我将api从.netcore2.1升级到.netcore3.1时,我发现我需要对我的实体框架代码进行大量修改

我没有意识到的是,我的远程数据库中的一个存储过程中有一个bug,它没有在我的.netcore2.1代码中表达出来

我遇到的错误消息并没有告诉我在存储过程内部进行检查的方向。我留下问题的最后形式,以防搜索错误消息对某人有所帮助

[问题]

我有以下代码来调用返回整数的存储过程

该代码在服务器端单元测试中工作,但在通过api或SwaggerUI调用时失败

var obj = connect.Ints.FromSqlInterpolated<intDto>(@$"Set NOCOUNT ON
          declare @num int 
          exec @num = spGetDefaultID {userName}  
          select @num as num").ToList();

id = (int)obj.First().num;
我这样做是为了不在数据库中得到不需要的表

而且

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<intDto>).HasNoKey().ToView("view_name_that_doesnt_exist");
请注意,我对这个问题进行了大量编辑,因为我曾经让api工作过,但现在不再工作了

我发现我必须使用.ToList(),否则我会出错

System.InvalidOperationException:FromSqlRaw或FromSqlInterpolated 使用不可组合的SQL和在其上组合的查询调用。 考虑调用FromSqlRaw后的<代码>可枚举的< /代码> FromSqlInterpolated方法在客户端上执行合成 一边

[更新]

我插入了下面的代码,它没有失败

 var obj = db.Ints.FromSqlInterpolated(@$"Set NOCOUNT on
                                       select count(*) as num from people 
                                       where email like  {name} ").ToList();
所以下一步是尝试创建一个新的存储过程

或者可能是数据库版本

有趣的是,除非我

Microsoft.EntityFrameworkCore.Relational.dll
在正在测试的项目中引用。即使我没有明确使用它

此场景中的错误消息是

System.MissingMethodException: 'Method not found:'System.Linq.IQueriable '1<!!O> 
Microsoft.EntityFrameworkCore.RelationalQueryableExtensions.
FromSqlInterpolated(Microsoft.EntityFrameworkCOre.DbSet'1<!!0>, 
System.FormattableString)'
[更新]

远程存储过程使用结果集返回数据

create PROCEDURE [dbo].[spGetDefaultID] 
@email varchar(300)
AS
BEGIN
    SET NOCOUNT ON;
    declare @cartID int
    select @CartID= id from people where email = @email   /* simplified */
    select @CartID /* this line was not present in my local database */
    return @CartID  
END

1.您需要修改存储过程。您需要一个输出参数。它应该是这样的:

CREATE PROCEDURE [dbo].[spGetDefaultID] (
                 @Username VARCHAR(100)
                ,@num_output int OUTPUT)
AS 
BEGIN
  SELECT @num_output = count(*)
  FROM [Person].[Person]
  WHERE PersonType LIKE (@Username)
RETURN
END
2.您需要修改一行代码。语法与您选择的略有不同。您需要输出语句

SET NOCOUNT ON
DECLARE @num INT
exec spGetDefaultID {UserName}, @num_output=@num OUTPUT;
SELECT @num AS num
让您感到困惑的一点可能是,SQL正在返回一个值,即使您像开始时那样编写它,但它没有将结果存储在@num参数中

我希望这能解决你的问题。
有关如何在Microsoft文档中找到的更多信息。

当我按照Zohar的建议尝试使用ssms调用存储过程时,我看到2个结果输出

当我移除不必要的

选择@CartID


问题已解决。

Public int?num.???当您尝试直接在SSMS中运行sql代码时会发生什么?我并没有真正解决任何问题,只是为您指出了正确的方向。我想你应该给你自己的问题贴一个答案。好吧,我错过了最新的修订+答案,因为这个问题已经在一个标签中打开了一段时间。尽管如此,这个问题仍然可以被浓缩,使它和答案更值得未来的访问者阅读。需要添加的一点是,您可以使用EXEC的WITH RESULT SETS部分来定义输出列及其名称。刚刚解决了我的FromSql问题。谢谢Mathias。我更新了问题,显示我正在通过结果集返回数据。
var obj = connect.Ints.FromSqlInterpolated<intDto>(@$"declare @num int 
          exec @num = spGetDefaultID {userName}").ToList();
The underlying reader doesn't have as many fields as expected
create PROCEDURE [dbo].[spGetDefaultID] 
@email varchar(300)
AS
BEGIN
    SET NOCOUNT ON;
    declare @cartID int
    select @CartID= id from people where email = @email   /* simplified */
    select @CartID /* this line was not present in my local database */
    return @CartID  
END
CREATE PROCEDURE [dbo].[spGetDefaultID] (
                 @Username VARCHAR(100)
                ,@num_output int OUTPUT)
AS 
BEGIN
  SELECT @num_output = count(*)
  FROM [Person].[Person]
  WHERE PersonType LIKE (@Username)
RETURN
END
SET NOCOUNT ON
DECLARE @num INT
exec spGetDefaultID {UserName}, @num_output=@num OUTPUT;
SELECT @num AS num