Есть ли способ выполнить несколько вычислений в хранимых процедурах? - PullRequest
0 голосов
/ 22 июня 2019

Я хотел бы знать, возможно ли выполнить серию вычислений в хранимых процедурах.Я использовал простые функции для выполнения расчетов, таких как ежемесячная оплата, чистая оплата и уплата налога.

Мое требование заключается в том, что должны быть сформированы платежные ведомости сотрудников для данных сотрудников.Базовая заработная плата, налогооблагаемый доход, налог и чистая заработная плата должны быть рассчитаны и сохранены для каждого платежного листа.

Ниже приведена таблица Payslip, в которую необходимо извлечь данные для процедуры и некоторые коды Iсделано.

Я получаю ошибки при выполнении процедуры для оператора SELECT EmpPay (SELECT * FROM Payslip).

Любая помощь очень ценится.

SELECT
    BasePay, TaxableIncome,
    FORMAT (TotalHrsWorked*HourlyRate, 'C') as MonthlyPay,
    FORMAT (BasePay - TaxableIncome, 'C') as Net_Pay,
    FORMAT (TaxableIncome/BasePay, 'N3') as Percent_Tax
FROM
    Payslip


CREATE TABLE Payslip
(
    PayslipRefNo CHAR(6),
    [Date] DATE,
    StartDate DATE,
    EndDate DATE,
    TotalHrsWorked INT,
    HourlyRate DECIMAL(4,2),
    BasePay DECIMAL(6, 2),
    TaxableIncome DECIMAL(6,2) CHECK (TaxableIncome <= 9999.00),
    NetPay DECIMAL(6,2),

    CONSTRAINT pk_payslip PRIMARY KEY (PayslipRefNo),
);

CREATE PROCEDURE EmpPay
    (@TaxableIncome AS DECIMAL(6, 2), 
     @BasePay AS DECIMAL(6, 2), 
     @TotalHrsWorked AS INT, 
     @HourlyRate AS DECIMAL(4,2))
AS
BEGIN
    RETURN (@TotalHrsWorked * @HourlyRate)
    RETURN (@BasePay - @TaxableIncome)
    RETURN (@TaxableIncome/@BasePay)
END

SELECT EmpPay(SELECT * FROM Payslip)

Ответы [ 2 ]

1 голос
/ 22 июня 2019

Хранимая процедура может возвращать данные тремя различными способами:

  1. Использование Return
  2. Использование запросов на выборку
  3. Использование аргументов 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

0 голосов
/ 22 июня 2019

Я не понял, как вы планировали писать, но я дам свою версию:

  1. Вы можете создать временную таблицу и записать в нее результаты.
  2. Вы можете просто объявить несколько переменных и отобразить их в конце своих решений.

Код:

Declare @a decimal(6,2),
        @b decimal(6,2),
        @c decimal(6,2)

SET @A = @TotalHrsWorked * @HourlyRate
SET @B = @BasePay - @TaxableIncome
SET @C = @TaxableIncome/@BasePay

SELECT @A, @B, @C

RETURN необходим для функций, которые возвращают значения, и процедура выполняетдействие без возврата какого-либо значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...