我想知道是否可以在存储过程中执行一系列计算。我使用简单的函数来执行计算,例如月薪,净薪和应纳税额。
我的要求是必须生成给定员工的员工工资单。需要计算并存储每个工资单的基本工资,应税收入,税金和净工资。
下面是我的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)
答案 0 :(得分:1)
存储过程可以通过3种不同的方式返回数据:
返回
您需要注意,如果您在代码中使用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
您可以一起使用上述所有方式。
关于查询的一个重要说明是,您需要使用EXEC
或EXECUTE
才能执行存储过程,并且不能使用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。
答案 1 :(得分:0)
我不明白您打算如何写作,但我会给出我的版本:
代码:
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,并且过程执行操作而不返回任何值。