#sql #sql-server #sql-server-2008
#sql #sql-сервер #sql-server-2008
Вопрос:
У меня есть процедура, которая вычисляет стоимость проезда на основе некоторых значений из других таблиц.
Процедура выглядит следующим образом:
create procedure CalculateTravelPrice(@ID int)
as
begin
return
(select SalaryForOneDay from Driver where driver.PersonID=@ID)
(select SalaryForOneDay from Driver where driver.PersonID=@ID)
end
Я пытаюсь добавить столбец, который использует эту процедуру для вычисления значения:
alter table RegisteredTravel
add PriceForTravel as (CalculateTravelPrice(RegTravelID))
но я получаю сообщение об ошибке
Сообщение 195, уровень 15, состояние 10, строка 2
«CalculateTravelPrice» не является распознанным именем встроенной функции «.
Итак, вопрос в том, как правильно использовать процедуру для вычисления этого значения? Это вообще хорошая практика или, может быть, есть лучший способ?
Комментарии:
1. Просто примечание: есть ли опечатка в вашем sql? — две части вашего запроса идентичны. В этом случае вам лучше просто выполнить x2 и сохранить прочитанные данные.
2. Я подозреваю, что вы будете НАМНОГО быстрее с помощью Join здесь!
Ответ №1:
Вы должны превратить свою процедуру в udf (определяемую пользователем функцию). Затем вы можете использовать это для своего вычисляемого столбца. Я не думаю, что procs можно использовать таким образом.
Комментарии:
1. Я изменил свою процедуру на function, но все та же ошибка — ‘CalculateTravelPrice’ не является распознанным именем встроенной функции. Я неправильно вызываю эту функцию или что?
2. функции должны включать схему в свой вызов, поэтому попробуйте изменить определение столбца на:
add PriceForTravel as (dbo.CalculateTravelPrice(RegTravelID))
3. Спасибо, только что понял это сам 1 минуту назад: D
4. не беспокойтесь. Просто посмотрите на производительность этого, хотя при выборе большого количества строк — udfs может быть медленным способом вычисления столбцов.
5. Да — он будет пересчитываться при каждом его вызове. Это также может быть плохо для вас, поскольку ваши данные будут обновляться по мере обновления «SalaryForOneDay». Я бы подумал, что это было бы неверно, поскольку вы хотели бы, чтобы стоимость была точной во время поездки. Возможно, вы захотите подумать о том, чтобы иметь правильный столбец и вместо этого заполнить его триггером after insert. Даже с представлением у вас возникнут проблемы с определением стоимости, какой она была на момент совершения перемещения.