Procedimiento almacenado Return

En esta sección se muestra cómo llamar procedimientos almacenados con ADO.NET: usar ExecuteNonQuery para obtener el número de filas afectadas y capturar al mismo tiempo el valor devuelto por Return del procedimiento almacenado.

1. Definición del procedimiento almacenado de base de datos

create procedure mynewproc(@id int)
as
begin
    declare @cout int
    -- Sentencia de actualización
    update Article set title = '111' where id = @id
    -- Contar registros con id mayor al parámetro de entrada
    select @cout = count(1) from Article where id > @id
    -- return devuelve valor numérico (en SQL Server return solo admite tipo int)
    return @cout
endLenguaje del código: PHP (php)

Importante: return @cout es el valor devuelto del procedimiento almacenado, distinto al parámetro de salida output.

2. Llamada desde C#

string connectionString = "Data Source=.;Initial Catalog=db;Integrated Security=SSPI;";
using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    SqlCommand command = new SqlCommand("mynewproc", connection);
    command.CommandType = CommandType.StoredProcedure;

    // 【Clave】Registrar parámetro para valor Return, nombre fijo ReturnValue
    SqlParameter para = new SqlParameter(
        "ReturnValue",
        SqlDbType.Int,
        4,
        ParameterDirection.ReturnValue,
        false,0,0,string.Empty,DataRowVersion.Default,null);
    command.Parameters.Add(para);

    // Parámetro de entrada del procedimiento almacenado @id
    SqlParameter param = new SqlParameter("@id", SqlDbType.Int, 8);
    param.Value = 4;
    param.Direction = ParameterDirection.Input;
    command.Parameters.Add(param);

    // ExecuteNonQuery: ejecuta insert/update/delete, devuelve 【filas afectadas por update】
    int rowsAffected = command.ExecuteNonQuery();
    // Leer el valor traído por return del procedimiento almacenado
    int result = (int)command.Parameters["ReturnValue"].Value;
}Lenguaje del código: PHP (php)

Forma recomendada de escribirlo

string connectionString = "Data Source=.;Initial Catalog=db;Integrated Security=SSPI;";
using (SqlConnection conn = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand("mynewproc", conn))
{
    conn.Open();
    cmd.CommandType = CommandType.StoredProcedure;

    // Registrar parámetro de retorno (nombre fijo: ReturnValue, dirección obligatoria ReturnValue)
    cmd.Parameters.Add("ReturnValue", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;
    // Parámetro de entrada
    cmd.Parameters.Add("@id", SqlDbType.Int).Value = 4;

    // rowsAffected = cantidad de registros modificados por la sentencia update
    int rowsAffected = cmd.ExecuteNonQuery();
    // Obtener el valor return @cout del procedimiento almacenado
    int procReturnVal = (int)cmd.Parameters["ReturnValue"].Value;
}Lenguaje del código: JavaScript (javascript)

Observaciones

1. int rowsAffected = command.ExecuteNonQuery();
  • Significado: número de filas afectadas por sentencias DML (update/delete/insert)
  • En este ejemplo: cantidad de registros coincidentes y modificados por update Article set title='111' where id=@id
  • No es el valor devuelto por return del procedimiento almacenado. Ambos son totalmente independientes
2. Parámetro de retorno ReturnValue
  1. El nombre del parámetro debe ser obligatoriamente la cadena fija ReturnValue, no se puede personalizar
  2. Direction = ParameterDirection.ReturnValue
  3. En procedimientos almacenados de SQL Server, return valor solo trabaja con tipo int
  4. Solo se puede leer el valor después de ejecutar ExecuteNonQuery()

  • Valor return: solo uno permitido, tipo int exclusivamente
  • Parámetro output: se pueden definir varios, admite múltiples tipos de datos

Diferencias

-- Dentro del procedimiento almacenado
update Article set title='111' where id=4; -- Supongamos que modifica una fila
return 10; -- valor devuelto por returnLenguaje del código: PHP (php)

Después de ejecutar:

  • rowsAffected = 1 (filas afectadas por update)
  • procReturnVal = 10 (valor traído por return)

Resumen

MétodoContenido devueltoCasos de uso
ExecuteReaderSqlDataReader (varias filas en streaming)Consultar múltiples registros
SqlDataAdapter.FillDataSet/DataTable (tabla sin conexión)Vincular tablas para controles WinForm
ExecuteScalarobject (primera columna de la primera fila)Cuando solo necesitas un resultado agregado
ExecuteNonQueryint(filas afectadas)+valor ReturnValueInsertar / actualizar / borrar, cuando se requiere código de estado del procedimiento

Procedimiento almacenado Return

Previous:

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *