You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core MVC中获取SQL Server存储过程输出变量值的方法

问题分析与解决方案

首先,ExecuteSqlRaw返回-1是正常行为——它的返回值代表SQL语句执行后受影响的行数,而非存储过程的输出参数或结果集。如果你的存储过程没有执行数据修改操作(比如INSERT/UPDATE/DELETE),就会返回-1。

要获取@Status和@Code这两个输出值,有两种可靠的方式:

方式一:使用参数化输出参数(推荐,避免SQL注入)

直接通过SqlParameter定义输出参数,无需拼接复杂SQL,同时规避字符串拼接带来的SQL注入风险:

// 定义输出参数
var statusParam = new SqlParameter("@Status", SqlDbType.NVarChar, 50) 
{ 
    Direction = ParameterDirection.Output 
};
var codeParam = new SqlParameter("@Code", SqlDbType.NVarChar, 50) 
{ 
    Direction = ParameterDirection.Output 
};
var unitIdParam = new SqlParameter("@UnitId", SqlDbType.NVarChar, 50) 
{ 
    Direction = ParameterDirection.Output 
};

// 执行存储过程
context.Database.ExecuteSqlRaw(
    "EXEC [dbo].[sp_CheckDelinquentStatus] @villageCode, @block, @lot, @Status OUTPUT, @Code OUTPUT, @UnitId OUTPUT",
    new SqlParameter("@villageCode", village.Name),
    new SqlParameter("@block", LopezProperties.BlockNumber),
    new SqlParameter("@lot", LopezProperties.LotNumber),
    statusParam,
    codeParam,
    unitIdParam
);

// 读取输出参数的值
var status = statusParam.Value?.ToString();
var code = codeParam.Value?.ToString();
var unitId = unitIdParam.Value?.ToString();

方式二:通过结果集读取(适合保留现有SQL结构的场景)

如果坚持使用当前的SQL语句,改用FromSqlRaw来读取存储过程返回的结果集(ExecuteSqlRaw不返回结果集):

  1. 先定义一个用于接收结果的实体类:
public class DelinquentResult
{
    public string Status { get; set; }
    public string Code { get; set; }
    public string UnitId { get; set; }
}
  1. 执行SQL并读取结果:
var result = context.Set<DelinquentResult>()
    .FromSqlRaw(delinquentSql)
    .FirstOrDefault();

if (result != null)
{
    var status = result.Status;
    var code = result.Code;
    var unitId = result.UnitId;
}

注意:这种方式仍存在SQL注入风险,建议优先使用方式一的参数化查询。

内容的提问来源于stack exchange,提问作者Nyssa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 01:38:21