wichaelmilson Ответов: 1

ТВП хранимая процедура начисления заработной платы должна объявить скалярную переменную


Привет,
В настоящее время у меня возникла проблема при выполнении с @employeeinfo в последнем операторе execute. Это проблема объявления или проблема строки? как я могу это исправить?

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

@employeeinfo должен проходить через TVP, но я получаю "должен объявить скалярную переменную @employeeinfo"

Заранее спасибо


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
    	DECLARE @stDate DATE,
    			@EdDate DATE,
    			@tx	INT,
    			@noHours INT,
    			@allow INT
    	SELECT p.employeeID,
    		  @taxID, @StartDatePeriod,
    		  @EndDatePeriod,
    		  p.TotalHours,
    		  pos.hourlyRate * p.TotalHours,
    		 (pos.hourlyRate * p.TotalHours) + h.AmountSold,
    		 ((pos.hourlyRate * p.TotalHours) + h.AmountSold) * t.taxRate, 
    		 ((pos.hourlyRate * p.TotalHours) + h.AmountSold) - (((pos.hourlyRate * p.TotalHours) + h.AmountSold) * t.taxRate)
    	FROM PaySlip p
    	INNER JOIN HumanResources h ON h.EmployeeID = p.EmployeeID
    	INNER JOIN Taxes t ON t.TaxID = p.TaxID
    	INNER JOIN Position pos ON pos.HourlyRate = p.EmployeeID
    	-- add position in somehow
    
    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
    DROP PROCEDURE usp_createPayroll


Что я уже пробовал:

Я пытался изменить оператор select и объявить переменные, когда изначально у меня был оператор insert

1 Ответов

Рейтинг:
1

CHill60

Отлично работает для меня, если только я не забуду включить код из DECLARE @employeeInfo EmployeeInfo;Если я опущу это объявление из своего выбора Перед тем, как нажать F5, то получу ту же ошибку, что и вы.

То есть вы должны выполнить все следующие действия:

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

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

И я не думаю, что
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
делает то, что вы думаете - это, вероятно, должно быть
IF EXISTS(SELECT * FROM sys.procedures WHERE name='usp_createPayroll')
...