2013-08-29 72 views
0

對於員工11來說,任何想法都會降低總員工的薪水10.44,但是對於某些重新設置,其舍入爲10,即使他們都設置爲小數(8,2)向下舍入sql server 2008 r2

ALTER procedure [dbo].[hms_GetEmployeeSallaryByEmpNo] 
    (

    @Id int 
    ) 
as 
/* lets make our tempory tables */ 
create table #contracts 
( 
empno INT, 
contract_id INT 
) 

DECLARE @contract_id int 
DECLARE @totalsallary decimal(8,2) 
begin 
    INSERT into #contracts SELECT c.emp_no,c.contract_id 
    FROM contract c 
    where c.emp_no = @Id AND c.leave_date='1900-01-01 00:00:00.000' 
end 

SET @totalsallary =(select SUM(salary) 
from #contracts c,salary s 
where s.contract_id = c.contract_id) 
return @totalsallary 

回答

1

存儲過程只能返回整數值:

MSDN

存儲過程可以返回一個在對於調用程序或應用程序來說,泰格的價值。

你需要的是一個輸出參數:

ALTER procedure [dbo].[hms_GetEmployeeSalaryByEmpNo] 
(
    @Id int, 
    @totalsalary decimal(8,2) OUTPUT 
) 
... 
SET @totalsalary = 
(
    SELECT SUM(salary) 
    FROM #contracts c,salary s 
    WHERE s.contract_id = c.contract_id 
) 

--return @totalsalary -- not necessary anymore 

或標量值功能:

CREATE FUNCTION [dbo].[hms_GetEmployeeSalaryByEmpNo] 
(
    @Id int 
) 
RETURNS DECIMAL(8,2) 
AS 
.... 
SET @totalsalary = 
(
    SELECT SUM(salary) 
    FROM #contracts c,salary s 
    WHERE s.contract_id = c.contract_id 
) 

RETURN @totalsalary 

*也注意到,我在糾正 「工資」 的拼寫我的例子。

+0

你已經在你的輸出參數上獲得了一個額外的'@',但我總是+1。 –

+1

@Damien_The_Unbeliever這是一個有效的(雖然非常規)標識符。 –

+1

@MartinSmith - true,但是他們需要在參數列表和SET語句中執行。目前,這是不一致的。此外,[不推薦](http://technet.microsoft.com/en-us/library/ms175874(v = sql.105).aspx):「某些Transact-SQL函數的名稱以符號@@)。爲避免與這些函數混淆,您不應使用以@@開頭的名稱。「 –