SQL Select поля функции табличного значения
У меня объявлена табличная функция, поэтому я могу вернуть несколько значений за один раз. Значения рассчитываются с использованием функций DECLARE и Maths и Date.
Функция структурирована таким образом, что она принимает только "зарегистрированную дату" и приоритет для проблем в системе поддержки. Я честно думал, что смогу выбрать следующее:
SELECT SupportCall.*, dbo.GetSLAStatus(SupportCall.createDate, SupportCall.priority).* FROM SupportCall
Я фактически закончил с:
SELECT SupportCall.*,
SLADays = (select SLADays from dbo.GetSLAStatus(SupportCall.createDate, SupportCall.priority)),
SLARecieved = (select SLAReceived from dbo.GetSLAStatus(SupportCall.createDate, SupportCall.priority)),
SLATarget = (select SLATarget from dbo.GetSLAStatus(SupportCall.createDate, SupportCall.priority)),
SLAHoursRemaining = (select SLAHoursRemaining from dbo.GetSLAStatus(SupportCall.createDate, SupportCall.priority))
From SupportCall
Я не вижу возможности присоединиться к заявке (что я все равно не до конца понимаю).
Кто-нибудь знает, будут ли вызовы функции с одинаковыми параметрами выполняться один раз? Если я не собираюсь заканчивать большим количеством подзапросов и вызовов функций при выполнении запроса, то мне все равно, код на самом деле довольно аккуратный, если не краткий.
Если есть огромные накладные расходы, кто-нибудь знает, как выбрать все столбцы из табличной функции такого типа (то есть без ключей, только несколько вычислений для одних и тех же входных данных).
Благодарю.
отметка
2 ответа
Вы не можете просто сделать это:
SELECT C.*,
F.SLADays,
F.SLAReceived,
F.SLATarget,
F.SLAHoursRemaining
From
SupportCall C
cross apply dbo.GetSLAStatus(C.createDate, C.priority) F
Я надеюсь, что ваша функция - встроенная функция (например, имеет единственный оператор, который запускает, возвращает возврат таблицы (...) и не имеет определенной таблицы результатов)
Не делай этого! Встроенные запросы НИКОГДА не быстрее, чем JOINS или APPLY. Перепишите ваш запрос и проверьте IO. Вы можете переписать это примерно так:
SELECT SupportCall.*,
SLADays = gs.SLADays,
SLAReceived = gs.SLAReceived,
...
From SupportCall sc
CROSS APPLY dbo.GetSLAStatus(SupportCall.createDate, SupportCall.priority) gs