Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 26.05.2014
Сообщений: 96

Повторный вызов функции

18.01.2019, 12:34. Показов 1990. Ответов 5
Метки sql (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, помогите пожалуйста с проблемой.
Существует пользовательская функция, внутри которой два раза вызывается другая функция, как сделать так, чтобы она не крутилась второй раз, а использовала данные из первого вызова? В целях ускорения выполнения запроса.
Пример:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE FUNCTION one (@data1 DATE, @data2 DATE)
RETURNS TABLE
AS
RETURN
(
SELECT a.*
FROM dva (@data1, @data2) a
JOIN
(SELECT t.*
FROM ( 
SELECT b.* 
FROM dva(@data1, @data2) b
) t
)c
ON a.go=c.bo
)
Функция два создается раньше.
Пробовал за место From dva(@data1, @data2) b, вставлять "а" , но ругается.
Пробовал временку, но внутри функции она не создается.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.01.2019, 12:34
Ответы с готовыми решениями:

Вызов процедуры из функции
Доброе время суток! Есть функция которая возвращает значение ID и если артикул не найден данные вставить вызвав хранимку и вернуть ID ...

Вызов функции на связанном сервере
Подскажите, где ошибка. Есть связанный сервер, SERV0, прописан,линкуется. На нем, в базе BASE0, болтается некая скалярная функция. Хочу...

Как прописать вызов скалярной функции в вычисляемом поле?
Здравствуйте. Подскажите как правильно прописать вызов скалярной функции в вычисляемом поле? Нужно чтобы table1.вычисляемое поле =...

5
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
18.01.2019, 14:05
Лучший ответ Сообщение было отмечено Ace23000 как решение

Решение

Цитата Сообщение от Ace23000 Посмотреть сообщение
как сделать так, чтобы она не крутилась второй раз, а использовала данные из первого вызова?
В инлайновой функции никак.

Добавлено через 30 минут
Хотя все-таки есть способ материализовать результат функции. Но не гаранированный. И не факт, что будет быстрее.

1. В возвращаемом функцией наборе найти столбцы, уникально идентифицирующий строку - (Ufield1, ..., UfieldN)
2. Тело функции написать так:
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
with cte as
(
 select
  Ufield1, ..., UfieldN,
  min(Somefield1) as Somefield1,
  ...
  min(SomefieldN) as SomefieldN
 from
  dva(@data1, @data2)
 group by
  Ufield1, ..., UfieldN
)
select
 ...
from
 cte a join
 cte b on b.SomeFieldX = a.SomeFieldY
1
0 / 0 / 0
Регистрация: 26.05.2014
Сообщений: 96
18.01.2019, 14:17  [ТС]
Может как-то преобразовать можно?
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
18.01.2019, 14:24
Цитата Сообщение от Ace23000 Посмотреть сообщение
Может как-то преобразовать можно?
Чего во что?
0
0 / 0 / 0
Регистрация: 26.05.2014
Сообщений: 96
18.01.2019, 14:42  [ТС]
Цитата Сообщение от invm Посмотреть сообщение
Чего во что?
Преобразовать функцию, так чтобы можно было повторно вызвать функцию внутри. Но это я написал до предложенного способа, хотя я его не очень понял, честно говоря.
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
18.01.2019, 15:01
Цитата Сообщение от Ace23000 Посмотреть сообщение
хотя я его не очень понял, честно говоря.
Когда результат агрегирования соединяется сам с собой, оптимизатор может решить, что закешировать его и использовать повторно выгоднее, чем агрегировать два раза.
В предложенном примере выполняется фиктивное агрегирование, что бы обмануть оптимизатор и попытаться заставить его сгенерировать план выполнения с кешированием (Table Spool) результата вызова функции dva.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.01.2019, 15:01
Помогаю со студенческими работами здесь

Access2000: Можно ли в качестве источника поля в форме указать вызов своей функции ?
Access2000: Можно ли в качестве источника поля в форме указать вызов своей функции с параметрами, которая вернет значение ? Как это...

Как заблокировать повторный запуск процедуры?
Есть две хранимых процедуры, - lock и unlock. Процедура unlock - изменяет (update) значения столбца state в таблице account с 1 на 0. ...

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

Функции, повторный вызов
Здравствуйте! Можете помочь? Например есть функция любая например: void showMsg{cout<<"Foo";}и мне надо вызвать ее N раз,...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru