Хранимая процедура может возвращать данные тремя различными способами:
- Использование Return
- Использование запросов на выборку
- Использование аргументов OUTPUT
Возвращение
Вы должны заметить, что если вы используете RETURN в своем коде, то коды после RETURN больше не будут выполняться. Таким образом, ваш код вернет только первые данные RETURN. Вот как вы можете использовать Return
и получить его значение
CREATE PROCEDURE PRO_Test(@p1 INT, @p2 INT)
AS
BEGIN
/*
Your codes Here
*/
RETURN 100
END
GO
DECLARE @returnResult VARCHAR(100)
EXEC @returnResult = dbo.PRO_Test @p1 = 10, @p2 = 20
SELECT @returnResult
Выбор запросов
Вы можете вернуть несколько результирующих наборов из SP с помощью запросов Select. как это:
CREATE PROCEDURE PRO_Test(@p1 INT,@p2 INT)
AS
BEGIN
SELECT @p1,@p1;
SELECT @p2,@p1;
END;
GO
EXEC dbo.PRO_Test @p1 = 0, @p2 = 0;
Выходной параметр
Вы также можете вернуть несколько данных, используя параметры вывода, например:
CREATE PROCEDURE PRO_Test(@p1 INT,@p2 INT, @p3 VARCHAR(100) OUT)
AS
BEGIN
SET @p3 = 'I am output'
END;
GO
DECLARE @p VARCHAR(100)
EXEC dbo.PRO_Test @p1 = 0, @p2 = 0, @p3 = @p OUT;
SELECT @p
Вы можете использовать все вышеперечисленные способы, все вместе.
Одно важное замечание о вашем запросе заключается в том, что вам нужно использовать EXEC
или EXECUTE
для выполнения хранимой процедуры, и вы не можете вызвать хранимую процедуру с помощью SELECT
.
Наконец
Фактически в своем запросе вы можете решить проблему, написав запрос SELECT
, который возвращает 3 столбца! Вы можете переписать ваш запрос следующим образом:
CREATE PROCEDURE EmpPay
(@TaxableIncome AS DECIMAL(6, 2),
@BasePay AS DECIMAL(6, 2),
@TotalHrsWorked AS INT,
@HourlyRate AS DECIMAL(4,2))
AS
BEGIN
Select (@TotalHrsWorked * @HourlyRate) as Col1, (@BasePay - @TaxableIncome) as Col2,(@TaxableIncome/@BasePay) as Col3
END
EXEC EmpPay @TaxableIncome = <your value>, @BasePay = <your value>,...
Чтобы выполнить итерацию внутри вашей таблицы и вызывать SP для каждой записи в таблице, вам нужно написать CURSOR
, однако, если SP просто выполняет некоторые вычисления и SELECT
s, вы можете переписать свой SP , как пользовательская функция, и используйте ее внутри SELECT
, без необходимости CURSOR
или SP.
Подробнее здесь: https://docs.microsoft.com/en-us/sql/relational-databases/stored-procedures/return-data-from-a-stored-procedure?view=sql-server-2017