2015-02-05 3 views
0

Давайте предположим, что у меня есть это:SQL Server - Кэширование локальных данных внутри функции

SELECT x, y, z 
FROM t1 
WHERE fn_ExpensiveLookup(x); 

И давайте предположим, что fn_ExpensiveLookup делает много дорогих операций (некоторые из которых могут быть кэшированы только для продолжительности запроса/подключения).

Я не могу использовать временные таблицы внутри скалярнозначных функций, и я считаю, что переменные таблицы не будут сохраняться между вызовами функций.

Итак, как я могу кэшировать некоторые вещи внутри функции?

+0

Не могли бы вы переместить часть дорогостоящей логики «кэширования» вне функции и передать результат в качестве второго параметра? – Curt

+0

@Curt Я могу только изменить предложение where и функцию. Остальная часть запроса не может измениться. –

+0

вы можете использовать временные таблицы внутри скалярнозначных функций, используя синонимы. Не рекомендуется, но это возможно. –

ответ

2

Будет ли можно переписать UDF как paramatized зрения, как это: Create parameterized VIEW in SQL Server 2008

В принципе нет END BEGIN .... Пишите все в select внутри оператора return.

Результаты будут повторно использованы (при условии, что никакие параметры не являются поплавками), и запрос будет основан на SET. Также добавьте С СХЕМЫ.

Если это возможно, запрос должен выполняться, как и любой другой предикат.

Смежные вопросы