Первый пример известен как «встроенная функция с табличным значением», которая имеет преимущества в производительности по сравнению с функцией с табличным значением с несколькими операторами, а именно сервер базы данных может перекомпоновать запрос с ITVF, встроенным в родительский запрос, по сути становясь параметризованным VIEWтогда как MSTVF ведет себя больше как непрозрачная хранимая процедура (хотя и со своими преимуществами по сравнению с sprocs). Встроенные функции должны быть предпочтительнее MSTVF. Если вам действительно нужно вычислить и сохранить промежуточные значения (например, результат сложного выражения скалярной функции), используйте подзапрос.
Дай,
1
Вероятно, также стоит упомянуть, что если результат того, что вы используете для заполнения переменной, которую вы хотите установить, каким-либо образом можно обобщить, вы можете подумать о написании отдельной функции для ее генерации. Это позволит вам использовать ITVF, описанный выше @Dai, со всеми его преимуществами, при этом вставляя динамически сгенерированное значение в вашу функцию. Я просто написал функцию с помощью вышеуказанного решения (спасибо @MikaelEriksson!), Которая передает один из своих параметров вспомогательной функции, чтобы избавить меня от необходимости использовать форму MSTVF.
naughtilus
1
самая большая стоимость - это вставка для моей функции, и я не знаю, как пропустить эту стоимость, не вставляя в таблицу переменную и не возвращая результат выбора
uzay95
@naughtilus, было бы здорово увидеть пример этого. Вы не думали дать еще один ответ вместе с вашим предложением?
Ответы:
Есть две разновидности табличных функций. Один - это просто оператор выбора, а другой может иметь больше строк, чем просто оператор выбора.
У этого не может быть переменной:
Вместо этого вы должны сделать так:
источник
VIEW
тогда как MSTVF ведет себя больше как непрозрачная хранимая процедура (хотя и со своими преимуществами по сравнению с sprocs). Встроенные функции должны быть предпочтительнее MSTVF. Если вам действительно нужно вычислить и сохранить промежуточные значения (например, результат сложного выражения скалярной функции), используйте подзапрос.