Функция будет вызываться только при необходимости. Если ваш последний оператор выбора не включает это поле, он вообще не вызывается. Если ваш окончательный выбор относится к 1% вашей таблицы, он будет вызван только для этого 1% таблицы.
Это фактически то же самое для подзапросов / встроенных представлений. Вы можете указать функцию для поля в подзапросе, затем никогда не использовать это поле, и в этом случае функция никогда не вызывается.
Как отступление: во многих отношениях скалярные функции действительно общеизвестно дороги. Вы можете иметь возможность уменьшить его стоимость, сформировав его как встроенную табличную функцию.
SELECT
myTable.*,
myFunction.Value
FROM
myTable
CROSS APPLY
myFunction(myTable.field1, myTable.field2) as myFunction
До тех пор, пока MyFunction является Inline (не мультисостоянием) и возвращает только одну строку для каждого набора входов, это часто масштабируется намного лучше, чем Scalar Functions.
Это немного отличается от превращения всего представления в табличную функцию, которая возвращает много строк.
Если такой TVF является многоуровневым, он будет вызывать функцию Зарплата для каждой записи. Но встроенные функции могут быть расширены встроенными, как будто макрос SQL, и поэтому вызывать Salary только по мере необходимости; нравится вид.
Как общее правило для TVF, не возвращайте записи, которые затем будут отброшены.