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
Другие вопросы по тегам