SQL Server, использующий процедуру для вычисления значения столбца

#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. Даже с представлением у вас возникнут проблемы с определением стоимости, какой она была на момент совершения перемещения.