如何从存储过程中获取输出参数结果和查询结果?

Posted

技术标签:

【中文标题】如何从存储过程中获取输出参数结果和查询结果?【英文标题】:How to get output parameter results and query result from stored procedure? 【发布时间】:2021-03-27 06:29:45 【问题描述】:

我有这个存储过程

CREATE PROCEDURE UpdateWeatherReport (
    @TemperatureData VARCHAR(100),
    @StationID VARCHAR(7),
    @ErrorCode INT OUTPUT,
    @ErrorMessage VARCHAR(200) OUTPUT
)
AS
BEGIN

        SET @ErrorCode=12;
        SET @ErrorMessage='test error message';

        DECLARE @PredictionValid BIT = 'true' 
        DECLARE @ExpiryDays TINYINT = 2
        
        SELECT 
        @PredictionValid AS [PredictionValid]
        ,@ExpiryDays AS [ExpiryDays]
END

我使用 Entity Framework Core 使用 DbContext 从 C# 调用

 var pTemperatureData = new SqlParameter("@TemperatureData", System.Data.SqlDbType.VarChar)  Value = "...", Direction = System.Data.ParameterDirection.Input ;
 var pStationID = new SqlParameter("@StationID", System.Data.SqlDbType.VarChar)  Value = "...", Direction = System.Data.ParameterDirection.Input ;
 var pErrorCode = new SqlParameter("@ErrorCode", System.Data.SqlDbType.Int)  Direction = System.Data.ParameterDirection.Output ;
 var pErrorMessage = new SqlParameter("@ErrorMessage", System.Data.SqlDbType.Int, size: 200)  Direction = System.Data.ParameterDirection.Output ;

 var sql = $"EXECUTE name ";
 parameters.ForEach(p => sql += $"p.ParameterName,");
 sql = sql.TrimEnd(',');
 
 //"EXECUTE UpdateWeatherReport @TemperatureData, @StationID, @ErrorCode, @ErrorMessage"

await Context.Database.ExecuteSqlRawAsync(sql, parameters.ToArray());

pErrorCode.Value; <-------------------- empty after call to stored procedure
pErrorMessage.Value; <----------------- empty after call to stored procedure

当我从代码中调用 SP 时,输出参数为空。如何获取代码中的输出参数值?


当我直接从 SQL 调用 SP 时,输出参数被正确填充。

DECLARE @TemperatureData VARCHAR(100)='abc 123 def 456 ...';
DECLARE @StationID VARCHAR(7)='19372';
DECLARE @ErrorCode INT;
DECLARE @ErrorMessage VARCHAR(200);

EXEC UpdateWeatherReport  @ParcelBarcode, @StationID, @ParcelStatus, @DateDelivered, @PickupCode, @ErrorCode OUTPUT, @ErrorMessage OUTPUT;

【问题讨论】:

【参考方案1】:

在 SQL 文本中构建参数时,您缺少 OUTPUT 关键字:

EXECUTE UpdateWeatherReport @TemperatureData, @StationID, @ErrorCode, @ErrorMessage

应该是:

EXECUTE UpdateWeatherReport @TemperatureData, @StationID, @ErrorCode OUTPUT, @ErrorMessage OUTPUT

您可以通过修改将参数添加到 SQL 文本的行来解决此问题:

parameters.ForEach(p => sql += $"p.ParameterName(p.Direction == System.Data.ParameterDirection.Output ? " OUTPUT" : string.Empty),");

【讨论】:

非常感谢!

以上是关于如何从存储过程中获取输出参数结果和查询结果?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 存储过程,获取使用游标查询的结果集

如何php调用oracle存储过程返回的是一个结果集,该怎么从php页面中吧数据循环输出呀

如何在输出中调用具有聚合结果的存储过程?

Oracle存储过程中,查询结果有多行如何赋值

sql server存储过程如何输出结果集

使用存储过程从查询中获取结果