Использование параметров в мульти-операторной функции SQL Server - PullRequest
0 голосов
/ 04 мая 2018

У меня проблемы с созданием простой функции для базы данных проката автомобилей в SQL Server.

CREATE FUNCTION F_late_price 
    (@from_date DATETIME, 
     @to_date DATETIME,
     @fee_per_day INT) 
RETURNS @Late_Customers_fees TABLE                  
                    (Id_Cust INT, 
                     Date_of_Rent_End_Due DATETIME,
                     Date_of_Rent_End DATETIME,
                     Total_fee AS (DATEDIFF(DAY, Date_of_Rent_End_Due, Date_of_Rent_End)) * @fee_per_day
                    )                                                                  
AS                                                                  
BEGIN 
    IF @from_date <= @to_date 
    BEGIN
        INSERT INTO @Late_Customers_fees
            SELECT 
                Id_Cust, Date_of_Rent_End_Due, Date_of_Rent_End
            FROM 
                F_late_customers(@from_date, @to_date)
    END

    RETURN                                                         
END

Функция F_late_customers передается две даты и возвращает таблицу с клиентами, конечная дата которых истекает:

CREATE FUNCTION F_late_customers 
    (@from_date DATETIME,
     @to_date DATETIME)
RETURNS @Late_Customers_details TABLE                  
                        (Id_Cust INT,
                         F_Name NVARCHAR(16),
                         L_Name NVARCHAR(16),
                         Date_of_Rent_Start DATETIME,
                         Date_of_Rent_End_Due DATETIME,
                         Date_of_Rent_End DATETIME
                        )                    
AS 
BEGIN                                     
    IF @from_date <= @to_date 
    BEGIN
        INSERT INTO @Late_Customers_details
            SELECT  
                dbo.Customers.Id_Cust,
                dbo.Customers.F_Name, dbo.Customers.L_Name, 
                dbo.Rents.Date_Of_Rent_Start, 
                dbo.Rents.Date_Of_Rent_End_Due, dbo.Rents.Date_Of_Rent_End
            FROM    
                dbo.Customers 
            INNER JOIN 
                dbo.Rents ON dbo.Customers.Id_Cust = dbo.Rents.ID_Cust
            WHERE  
                (dbo.Rents.Date_Of_Rent_End_Due) < (dbo.Rents.Date_Of_Rent_End)
    END

    RETURN
END

Но функция F_late_price выдает ошибку об использовании @fee_per_day в качестве параметра в операторе создания таблицы.

Есть ли способ решить эту проблему?

Буду признателен за любую помощь

Спасибо

1 Ответ

0 голосов
/ 04 мая 2018

Вы не можете использовать это в объявлении таблицы:

Total_fee AS (DATEDIFF(DAY, Date_of_Rent_End_Due, Date_of_Rent_End)) * @fee_per_day

Так что-то вроде этого:

CREATE FUNCTION  F_late_price 
    (@from_date DATETIME, 
     @to_date DATETIME,
     @fee_per_day INT) 
RETURNS @Late_Customers_fees TABLE                  
                        (Id_Cust INT, 
                         Date_of_Rent_End_Due DATETIME,
                         Date_of_Rent_End DATETIME,
                         Total_fee AS DECIMAL(18,2)   
                        )                                                                  
AS                                                                  
BEGIN 
    IF @from_date <= @to_date 
    BEGIN
        INSERT INTO @Late_Customers_fees
            SELECT 
                Id_Cust, Date_of_Rent_End_Due, Date_of_Rent_End, 
                (DATEDIFF(DAY, Date_of_Rent_End_Due, Date_of_Rent_End)) * @fee_per_day AS TotalFee
            FROM 
                F_late_customers(@from_date, @to_date)
    END

    RETURN                                                         
END

Тип данных TotalFee может быть не тем, что вам нужно, поэтому вам может потребоваться изменить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...