Создание функции SQL

Есть таблица Туры с полями:

  • ID_тура
  • Страна,
  • Город,
  • Отель,
  • Количество_звезд,
  • Длительность,
  • Цена_для_взрослых,
  • Цена_для_детей,
  • Цена_для_младенцев.

Также есть другая таблица Путевки с полями:

  • ID_путевки,
  • Количество_взрослых,
  • Количество_детей,
  • Количество_младенцев,
  • Стоимость - нужно вычислить.

Необходимо получить доступ к данным из таблицы Туры.

Т.е. в таблице путевки есть поле стоимость которая должна быть вычисляемым столбцом. Расчет по формуле : (@Количество_взрослых * Туры.Цена_для_взрослых)+ (@Количество_детей * Туры.Цена_для_детей)+(@Количество_младенцев * Туры.Цена_для_младенцев)

Написал функцию, но получаю ошибку связанную с неправильным синтаксисом около SELECT

CREATE FUNCTION dbo.GetValue(@Количество_взрослых INT, 
                             @Количество_детей INT,
                             @Количество_младенцев INT)
    RETURNS MONEY
    AS
      SELECT (@Количество_взрослых * Туры.Цена_для_взрослых) + 
             (@Количество_детей * Туры.Цена_для_детей) +
             (@Количество_младенцев * Туры.Цена_для_младенцев)
      FROM dbo.Туры ;


 
CREATE TABLE dbo.Путевки(
  ID_путевки INT IDENTITY(1,1),
  Количество_взрослых INT NOT NULL,
  Количество_детей INT NOT NULL,
  Количество_младенцев INT NOT NULL,
  Стоимость AS dbo.GetValue(Количество_взрослых, 
                            Количество_детей, 
                            Количество_младенцев)
  PRIMARY KEY(ID_путевки)
);

Ответы (1 шт):

Автор решения: Yitzhak Khabinsky

Пожалуйста, попробуйте следующее решение.

Несколько наблюдений:

  • Это скалярная функция, но в таблице может быть много строк. Вот почему мне пришлось добавить TOP (1). Это вопрос для вашей логики. Я не уверен, что это правильно.
  • Оператор RETURN отсутствовал.

SQL

CREATE FUNCTION dbo.GetValue(@Количество_взрослых INT, 
                             @Количество_детей INT,
                             @Количество_младенцев INT)
RETURNS MONEY
AS
BEGIN
    RETURN (SELECT TOP(1) (@Количество_взрослых * Туры.Цена_для_взрослых) + 
            (@Количество_детей * Туры.Цена_для_детей) +
            (@Количество_младенцев * Туры.Цена_для_младенцев)
    FROM dbo.Туры);
END
→ Ссылка