有没有一种方法可以在存储过程中执行多次计算?

时间:2019-06-22 08:02:07

标签: sql-server function tsql stored-procedures

我想知道是否可以在存储过程中执行一系列计算。我使用简单的函数来执行计算,例如月薪,净薪和应纳税额。

我的要求是必须生成给定员工的员工工资单。需要计算并存储每个工资单的基本工资,应税收入,税金和净工资。

下面是我的Payslip表,该表中的数据必须从该过程中提取,并且已经完成一些代码。

在执行该语句的过程中出现错误 选择EmpPay(选择*从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 个答案:

答案 0 :(得分:1)

存储过程可以通过3种不同的方式返回数据:

  1. 使用退货
  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返回多个结果集。像这样:

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;

输出参数

您还可以使用Output参数返回多个数据,如下所示:

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

您可以一起使用上述所有方式。

关于查询的一个重要说明是,您需要使用EXECEXECUTE才能执行存储过程,并且不能使用SELECT调用存储过程。

最后

实际上,在您的查询中,您可以通过编写返回三列的SELECT查询来解决该问题!您可以按以下方式重写查询:

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,则您可以将SP重写为用户定义的函数,并在SELECT或SP中使用它,而无需CURSOR或SP。

在此处了解更多信息:https://docs.microsoft.com/en-us/sql/relational-databases/stored-procedures/return-data-from-a-stored-procedure?view=sql-server-2017

答案 1 :(得分:0)

我不明白您打算如何写作,但我会给出我的版本:

  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,并且过程执行操作而不返回任何值。