2010-09-28 16 views
33

¿Cuándo usaría un parámetro de salida frente a una variable de retorno, o viceversa? En el siguiente ejemplo simple, puedo lograr lo mismo usando cualquiera de los dos.Procedimiento almacenado, cuándo utilizar el parámetro de salida frente a la variable de retorno

Utilizando el parámetro de salida

create proc dbo.TestOutput (@InValue int, @OutValue int output) 
as 
set @OutValue = @InValue 

declare @x int 
exec TestOutput @InValue = 3, @OutValue = @x output 
select @x 

Usando variable de retorno:

create proc dbo.TestReturn (@InValue int) 
as 
return @InValue 

declare @x int 
exec @x = TestReturn @InValue = 3 
select @x 

Como se puede ver, ambas hacen lo mismo. ¿Puede alguien mostrarme un ejemplo en el que la elección de un parámetro de salida frente a una variable de retorno suponga una diferencia?

+2

Puede reconsiderar su segundo ejemplo, como lo es antes de realizar cualquier trabajo interesante;) –

+1

Hace tanto trabajo como el primer ejemplo. Tenga en cuenta la falta de BEGIN/END: cada uno de esos procesos consta de una sola declaración. El segundo bloque en cada ejemplo llama al primer bloque. – Timbo

Respuesta

13

Prefiero:

El uso de un valor de retorno cuando sólo se necesita devolver un artículo.

Usar parámetros de salida cuando necesite devolver más de un valor.

Otro patrón de uso común, aunque no es mi preferencia, es usar valores de retorno solo para informar de éxito o falla y los parámetros de salida para cualquier cosa que deba devolverse.

+1

Me gustó esta respuesta antes de editarla. Ahora se lee como "Muchos hacen esto ... pero podrías hacer esto en su lugar". Puede elegir uno: P – cHao

+1

Simplemente exponiendo las dos corrientes principales de pensamiento sobre él. :-) – klabranche

11

Esto es T-SQL, no C. Nunca use valores devueltos, muchas API del lado del cliente hacen que lidiar con los valores devueltos sea doloroso si no imposible. Use siempre los parámetros de SALIDA.

+1

Los valores RETURN que indican éxito/falla pueden ser muy útiles cuando se trata de llamadas a procedimientos almacenados anidados. –

+3

Diría que BEGIN TRY/BEGIN CATCH y RAISERROR son mucho más útiles que los valores devueltos. –

8

Dado que los valores de retorno solo funcionan con int, terminan siendo "inconsistentes". Prefiero el parámetro de salida para la coherencia.

Además, los parámetros de salida obligan a la persona que llama a reconocer el valor devuelto. IME, los valores de retorno son rutinariamente ignorados.

7

Debe usar RETORNO para devolver un valor de un procedimiento de forma muy similar a como lo haría con EXIT para devolver un valor en un script por lotes. El retorno no es realmente para el paso de parámetros, sino más bien como una forma de salir de un procedimiento o consulta. Según MSDN documentation:

A menos que se indique lo contrario, todos los procedimientos almacenados del sistema devuelven un valor de 0. Esto indica éxito y un valor distinto de cero indica un error.

Esto se vuelve más evidente una vez que reconoce la falta de capacidad para definir un tipo para su valor de retorno. Tiene que ser INT.

+0

Salir (como un error de nivel de archivo por lotes) es una buena idea. También he visto ejemplos que ponen rowcount allí para que pueda ver cuántas filas (si las hay) se vieron afectadas. – Curtis

1

Voy a responder a esta pregunta de diferentes maneras:

Si desea volver algún valor que tiene las dos opciones. Pero si desea devolver múltiples valores, solo necesita seguir con los parámetros de salida.

Segundo escenario: En C# tiene el control de tipo si está utilizando los parámetros de salida.

Tercer escenario: Función vs. Procedimiento Seleccione el que mejor se adapte a sus necesidades.

Esperanza esto ayuda

0

utilizo valor de retorno a muchas cosas porque es más performativo como:

1 - Al insertar o cambiar un artículo cuando lo haga la validación de la base de datos Volver número positivo para devolver la identidad y negativo con el número del error, es más rápido.

2- Cuando programo una cita con paginación, utilicéelo para devolver que la cantidad total de registros también es más rápida y menos costosa. Por lo demás, uso Output cuando hay varias devoluciones o diferentes tipos de int. Y, por supuesto, uso recorset para devolver una lista de elementos

¿Cómo uso Dapper para hacer que mis consultas no sufran?

1

tomado de here

  • Cuando se desea devolver uno o varios elementos, con un tipo de datos, entonces es mejor usar un parámetro de salida.
  • Generalmente, use un parámetro de salida para todo lo que deba devolverse.
  • Cuando desea devolver solo un elemento con solo un tipo de datos entero, entonces es mejor usar un valor de retorno.
  • En general, el valor de retorno es solo para informar el éxito o el fracaso del Procedimiento almacenado.
  • Un elemento de la lista de devolución un valor de 0 indica éxito y cualquier valor distinto de cero indica falla.
Cuestiones relacionadas