2012-08-15 12 views

Respuesta

79

Eso depende de la naturaleza de la información que desea devolver.

Si se trata de un único valor entero, puede utilizar la return comunicado

create proc myproc 
as 
begin 
    return 1 
end 
go 
declare @i int 
exec @i = myproc 

Si usted tiene un valor entero no, o una serie de valores escalares, puede utilizar los parámetros de salida

create proc myproc 
    @a int output, 
    @b varchar(50) output 
as 
begin 
    select @a = 1, @b='hello' 
end 
go 
declare @i int, @j varchar(50) 
exec myproc @i output, @j output 

Si desea devolver un conjunto de datos, puede utilizar insert exec

create proc myproc 
as 
begin 
    select name from sysobjects 
end 
go 

declare @t table (name varchar(100)) 
insert @t (name) 
exec myproc 

incluso puede devolver un cursor pero eso es sólo horrible así que no daré un ejemplo :)

+9

Para enteros, aún debe usar parámetros de salida. Valor de retorno de la reserva para lo que están diseñados: estado. Los buenos programadores separan conceptos y escriben código sólido. ¿Qué sucede si su procedimiento almacenado que devuelve un número entero falla? –

+0

observé anomoly que cuando devuelvo un decimal sus decimales son cero, pero cuando lo cambio para seleccionarlo devuelve las posiciones decimales correctamente. – Rama

+2

@DRAM 'return' devuelve un único valor ** entero – podiluska

7

Puede usar la instrucción return dentro de un procedimiento almacenado para devolver un código de estado entero (y solo de tipo entero). Por convención, se usa un valor de retorno de cero para tener éxito.

Si no se establece explícitamente return, el procedimiento almacenado devuelve cero.

CREATE PROCEDURE GetImmediateManager 
     @employeeID INT, 
     @managerID INT OUTPUT 
    AS 
    BEGIN 
    SELECT @managerID = ManagerID 
    FROM HumanResources.Employee 
    WHERE EmployeeID = @employeeID 

    if @@rowcount = 0 -- manager not found? 
     return 1; 
    END 

Y se llama de esta manera:

DECLARE @return_status int; 
DECLARE @managerID int; 

EXEC @return_status = GetImmediateManager 2, @managerID output; 
if @return_status = 1 
    print N'Immediate manager not found!'; 
else 
    print N'ManagerID is ' + @managerID; 
go 

se debe utilizar el valor de cambio de los códigos de estado solamente. Para devolver datos, debe usar los parámetros de salida.

Si desea devolver un conjunto de datos, utilice un parámetro de salida del tipo cursor.

more on RETURN statement

+3

@downvoter, ¿te importa explicar qué pasa? –

3

utilizar este código, funciona correctamente

CREATE PROCEDURE [dbo].[sp_delete_item] 
@ItemId int = 0 
@status bit OUT 

AS 
Begin 
DECLARE @cnt int; 
DECLARE @status int =0; 
SET NOCOUNT OFF 
SELECT @cnt =COUNT(Id) from ItemTransaction where ItemId = @ItemId 
if(@cnt = 1) 
    Begin 
    return @status; 
    End 
else 
    Begin 
    SET @status =1; 
    return @status; 
End 
END 

Ejecutar SP

DECLARE @statuss bit; 
EXECUTE [dbo].[sp_delete_item] 6, @statuss output; 
PRINT @statuss; 
Cuestiones relacionadas