2017-04-25 9 views
0

私はpayslipの給与計算を生成するためにいくつかのコードを渡そうとしていますが、スクリプトをテストするときに影響を受けないローがあります。 私のパラメータは、 'startdate'、 'endnote'、 'taxID'、および時間と割引の引当金を取る2つのtvpテーブルを許可します。payroll tvpストアプロシージャは影響を受けていません

どのように情報を伝えることができますか?このセクションでは

IF EXISTS(SELECT * FROM sys.Databases WHERE name='usp_createPayroll') 
BEGIN 
    DROP PROCEDURE dbo.usp_createPayroll 
    DROP TYPE dbo.EmployeeInfo 
    DROP TYPE dbo.AllowanceInfo 
END 

CREATE TYPE EmployeeInfo AS TABLE 
(
    employeeID INT 
    ,TotalHours INT 
    ,PRIMARY KEY (
     employeeID 
     ,TotalHours 
     ) 
); 
GO 

CREATE TYPE AllowanceInfo AS TABLE 
(
    employeeID INT, allowanceID INT, Amount DECIMAL(7, 2),PRIMARY KEY (
     employeeID, allowanceID, Amount 
     ) 
); 
GO 

CREATE PROCEDURE usp_createPayroll @StartDatePeriod DATE ,@EndDatePeriod DATE, @taxID INT, @numberofTotalHours EmployeeInfo READONLY, @Allowance AllowanceInfo READONLY 
AS 
BEGIN 
    INSERT INTO Payslip 
    SELECT h.employeeID, 
      @taxID, @StartDatePeriod, 
      @EndDatePeriod, 
      h.TotalHours, 
      p.hourlyRate * h.TotalHours, 
     (p.hourlyRate * h.TotalHours) + a.Amount, 
     ((p.hourlyRate * h.TotalHours) + a.Amount) * t.taxRate, 
     ((p.hourlyRate * h.TotalHours) + a.Amount) - (((p.hourlyRate * h.TotalHours) + a.Amount) * t.taxRate) 
    FROM @numberofTotalHours h, @Allowance a, Position p, PayAllowance pa, HumanResources e, Taxes t, EmployeePositions ep 
    WHERE (e.employeeID = ep.employeeID AND ep.PositionID = p.PositionID) AND e.employeeID = h.employeeID AND t.taxID = @taxID 
END 

DECLARE @employeeInfo EmployeeInfo; 
DECLARE @TotalHours INT; 

INSERT @employeeInfo 
SELECT e.employeeID, @TotalHours 
FROM HumanResources e 
WHERE e.employeeID = 2 AND @TotalHours = 30 

DECLARE @allowanceInfo AllowanceInfo; 
DECLARE @employeeAllowanceInfo EmployeeInfo; 

INSERT @allowanceInfo 
SELECT e.employeeID, pa.allowanceID, pa.Amount 
FROM HumanResources e, Allowance a, PayAllowance pa, EmployeeAllowance ea, @employeeAllowanceInfo emp 
WHERE e.employeeID = emp.employeeID AND pa.AllowanceID = a.AllowanceID AND a.AllowanceID = ea.AllowanceID AND pa.allowanceID = 1 

EXECUTE usp_createPayroll 
    @startDatePeriod = '01-01-2015 23:59:59' 
    ,@endDatePeriod = '01-31-2015 23:59:59' 
    ,@taxID = 2 
    ,@numberofTotalHours = @employeeInfo 
    ,@Allowance = @allowanceInfo 
GO 

SELECT * 
FROM PaySlip 
+1

[キックする悪い習慣:古いスタイルのJOINを使用して - アーロン・ベルトラン](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick- using-old-style-joins.aspx) – SqlZim

答えて

0

@TotalHoursあなたはHumanResourcesからの行を取得しないだろうので、nullです:このセクションでは

declare @employeeInfo EmployeeInfo; 
declare @TotalHours int; 

insert @employeeInfo 
select 
    e.employeeID 
    , @TotalHours 
from HumanResources e 
where e.employeeID = 2 
    and @TotalHours = 30 

を、@employeeAllowanceInfoが宣言されますが、行が挿入されていないので、where e.employeeID = emp.employeeID返される行がないことを意味します。

declare @allowanceInfo AllowanceInfo; 
declare @employeeAllowanceInfo EmployeeInfo; 

insert @allowanceInfo 
select e.employeeID 
, pa.allowanceID 
, pa.Amount 
from HumanResources e 
, Allowance a 
, PayAllowance pa 
, EmployeeAllowance ea 
, @employeeAllowanceInfo emp 
where e.employeeID = emp.employeeID 
    and pa.AllowanceID = a.AllowanceID 
    and a.AllowanceID = ea.AllowanceID 
    and pa.allowanceID = 1 
関連する問題