Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Пользовательская функция с цепными расчетами / 25 сообщений из 45, страница 1 из 2
20.12.2017, 15:22:05
    #39572805
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция с цепными расчетами
Здравствуйте!

Подскажите, можно ли в Microsoft SQL Server написать такую пользовательскую функцию, в которой передаются параметры, внутри функции выгружает нужные данные в соответствие переданными параметрами, делает расчеты и возвращает нужный результат?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Declare @StartDate date ='2017-11-01'
Declare @EndDate date ='2017-11-30'
Declare @КоличествоРасчетныхМер integer = 3

SELECT
	ТТ,
	SKU,
	ПользовательскаяФункция (ТТ, SKU, StartDate, EndDate, КоличествоРасчетныхМер)
FROM
	Таблица


Логика расчетов следующая. Пользовательская функция выгружает Мера1 и Мера2 при заданной ТТ и SKU по дням. А потом считает расчетные меры, причем так, что РасчетнаяМера3 зависит от РасчетнойМеры2 предыдущего дня, РасчетнаяМера2 зависит от РасчетнойМеры1 предыдущего дня, а РасчетнаяМера1 зависит от Мера1 и Мера2 текущих дней. Количество расчетных мер зависит от параметра КоличествоРасчетныхМер . И возвращает ПоследнююРасчетнуюМеру (в данном случае РасчетнаяМера3 ) от последней даты (в данном случае 30.11.2017), в данном случае - 8.

МераТТSKU01.11.201702.11.2017...29.11.201730.11.2017Мера1ТТ1SKU11020...90100Мера2ТТ1SKU11121...91101РасчетнаяМера1ТТ1SKU111...11РасчетнаяМера2ТТ1SKU132...11РасчетнаяМера3ТТ1SKU124...18
То есть в пользовательской функции происходят цепные расчеты.

Если да, то как это делается? И насколько сильно будет тормозить?
...
Рейтинг: 0 / 0
20.12.2017, 15:38:46
    #39572842
iiyama
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция с цепными расчетами
ferzmikk,

Зависит от выбранного Вами способа реализации алгоритма.
...
Рейтинг: 0 / 0
20.12.2017, 16:09:27
    #39572876
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция с цепными расчетами
А вернее, функция возвращала, скажем, три значения, и каждое возвращаемое значение помещалось в соответствующую в отдельную колонку, чтобы для каждой колонки не вызывать повторно функцию. Так возможно?
...
Рейтинг: 0 / 0
20.12.2017, 16:12:15
    #39572880
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция с цепными расчетами
ferzmikkА вернее, функция возвращала, скажем, три значения, и каждое возвращаемое значение помещалось в соответствующую в отдельную колонку, чтобы для каждой колонки не вызывать повторно функцию. Так возможно?Читайте про табличные функции. Лучше - функции inline.
...
Рейтинг: 0 / 0
20.12.2017, 16:13:51
    #39572881
Sergey Sizov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция с цепными расчетами
ferzmikkА вернее, функция возвращала, скажем, три значенияА функции уже научились возвращать несколько значений?
Или вы так витиевато обозвали возврат таблицы?, и каждое возвращаемое значение помещалось в соответствующую в отдельную колонку, чтобы для каждой колонки не вызывать повторно функцию. Так возможно?Если функция табличная, то никаких проблем.
...
Рейтинг: 0 / 0
20.12.2017, 16:14:58
    #39572882
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция с цепными расчетами
А почему это должна быть одна функция, а не несколько вызывающих друг друга?

И почему именно функция, а не процедура? Что функция, это осознанный выбор?
...
Рейтинг: 0 / 0
20.12.2017, 16:17:10
    #39572884
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция с цепными расчетами
CammomileА почему это должна быть одна функция, а не несколько вызывающих друг друга?

И почему именно функция, а не процедура? Что функция, это осознанный выбор?В общем случае процедуру в SELECT не вставишь
...
Рейтинг: 0 / 0
20.12.2017, 16:19:28
    #39572887
ptr128
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция с цепными расчетами
ferzmikkА вернее, функция возвращала, скажем, три значения, и каждое возвращаемое значение помещалось в соответствующую в отдельную колонку, чтобы для каждой колонки не вызывать повторно функцию. Так возможно?
Функция должна возвращать или одно значение, или таблицу. Соответственно, первую можно использовать в списке SELECT, а вторую - только вместо таблицы. Причем, функции, возвращающей таблицу, в качестве параметров, ничего кроме констант и локальных переменных передать нельзя.
В принципе, одно значение может инкапсулировать что угодно. Так что распарсить возвращаемую строку или XML можете и потом.
...
Рейтинг: 0 / 0
20.12.2017, 16:20:34
    #39572889
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция с цепными расчетами
iap, ну наверное я то понимаю в чем разница между ф-й и п-й, чай не первый десяток лет в теме.
Я автора спрашиваю нужен ли ему именно такой функционал, или он просто не задумывался о других вариантах.

По форме вопроса я вижу, что тут человек решает не задачу, а ищет ответ на вопрос "как сделать то что я считаю решением"


Вот у него задача "ездить в магазин по субботам", и он решил" куплю б/у ладу" и пришел на форум "посоветуйте как выбрать автотаз"

А может ему достаточно будет поставить убер на мобилу? Или посмотреть внимательно на карту, и понять что он добирается на мцк? А может у целевого магазина есть онлайн витрина с доставкой дешевле чем поездка на авто? Понимаете аналогию?
...
Рейтинг: 0 / 0
20.12.2017, 16:24:10
    #39572891
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция с цепными расчетами
ptr128Причем, функции, возвращающей таблицу, в качестве параметров, ничего кроме констант и локальных переменных передать нельзя.cross(outer) apply уже запретили?
...
Рейтинг: 0 / 0
20.12.2017, 16:29:00
    #39572897
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция с цепными расчетами
ptr128,

авторФункция должна возвращать или одно значение, или таблицу. Соответственно, первую можно использовать в списке SELECT, а вторую - только вместо таблицы. Причем, функции, возвращающей таблицу, в качестве параметров, ничего кроме констант и локальных переменных передать нельзя.
В принципе, одно значение может инкапсулировать что угодно. Так что распарсить возвращаемую строку или XML можете и потом.
кажду фразу в мраморе высечь!
...
Рейтинг: 0 / 0
20.12.2017, 16:30:13
    #39572899
ptr128
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция с цепными расчетами
invmptr128Причем, функции, возвращающей таблицу, в качестве параметров, ничего кроме констант и локальных переменных передать нельзя.cross(outer) apply уже запретили?
Читайте, что я написал винмательно.
А еще тут
"TABLE
Specifies that the return value of the table-valued function is a table. Only constants and @local_variables can be passed to table-valued functions. "
...
Рейтинг: 0 / 0
20.12.2017, 16:33:26
    #39572903
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция с цепными расчетами
ptr128invmпропущено...
cross(outer) apply уже запретили?
Читайте, что я написал винмательно.
А еще тут
"TABLE
Specifies that the return value of the table-valued function is a table. Only constants and @local_variables can be passed to table-valued functions. "
Забьемся на пять косариков, что я передм в табличную функцию параметры, которые не являются константой или переменной, м?
...
Рейтинг: 0 / 0
20.12.2017, 16:37:28
    #39572907
ptr128
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция с цепными расчетами
Cammomileptr128пропущено...

Читайте, что я написал винмательно.
А еще тут
"TABLE
Specifies that the return value of the table-valued function is a table. Only constants and @local_variables can be passed to table-valued functions. "
Забьемся на пять косариков, что я передм в табличную функцию параметры, которые не являются константой или переменной, м?
В MS SQL много недокументированных возможностей. Но я предпочитаю их не использовать. Не зря они недокументированные.
...
Рейтинг: 0 / 0
20.12.2017, 16:41:05
    #39572911
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция с цепными расчетами
ptr128Читайте, что я написал винмательно.Очень внимательно прочитал.
Теперь вы внимательно прочтите это .
...
Рейтинг: 0 / 0
20.12.2017, 16:44:17
    #39572919
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция с цепными расчетами
CammomileИ почему именно функция, а не процедура? Что функция, это осознанный выбор?В общем, писал макрос в экселе, который выгружает данные с полями ТТ , SKU , Дата , Мера1 , Мера2 . Потом из всех имеющихся вариантов ТТ+SKU создается соответствующий экземпляр класса. Каждый экземпляр заполняется из исходных данных. Внутри каждого экземпляра происходят цепные расчеты. Получаем статистику по каждому экземпляру. Для каждого экземпляра можно построить детализированную таблицу. Но когда много ТТ+SKU, то очень долго считает. Время уходит на заполнение экземпляра из исходных данных (ищет нужные строки), а также на цепные расчеты. Хотелось бы это дело ускорить и попробовать передать в SQL-запрос. Пока остановился на пользовательской функции как вариант. Не знаю, может быть есть какие нибудь другие возможности для решения данной задачи. Вот и хотел бы узнать.
...
Рейтинг: 0 / 0
20.12.2017, 16:51:05
    #39572925
ptr128
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция с цепными расчетами
invmptr128Читайте, что я написал винмательно.Очень внимательно прочитал.
Теперь вы внимательно прочтите это .

Спасибо! Давно не кодил, отстал от жизни (
...
Рейтинг: 0 / 0
20.12.2017, 16:51:44
    #39572926
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция с цепными расчетами
В идеале, если каждый экземпляр с данными бы сохранялся, чтобы потом заново не выгружать. А также потом вносить изменения в каких то экземплярах.
...
Рейтинг: 0 / 0
20.12.2017, 16:53:14
    #39572927
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция с цепными расчетами
Ну например процедура которая делает каскад вычеслений.
Скажем так, со стороны клиента фиолетово как именно получается нужный ему датасет.
Ты, условно говоря, хочешь нажать в экселе кнопку "Сделать Расчет" и чтобы сервер все посчитал и вернул данные?

Функция для этого не нужна.

Оформлять код в виде функции имеет смысл когда ты хочешь обращаться к этому коду через SELECT
Вызывать его в аплае, например. Как мне кажется, это не твой вариант.
...
Рейтинг: 0 / 0
20.12.2017, 16:53:40
    #39572928
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция с цепными расчетами
ptr128
В MS SQL много недокументированных возможностей. Но я предпочитаю их не использовать. Не зря они недокументированные.
Я буду пользоваться только документированными возможностями, готов рискнуть?
...
Рейтинг: 0 / 0
20.12.2017, 16:57:40
    #39572931
ptr128
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция с цепными расчетами
Cammomileptr128
В MS SQL много недокументированных возможностей. Но я предпочитаю их не использовать. Не зря они недокументированные.
Я буду пользоваться только документированными возможностями, готов рискнуть?
Вы флудите дальше. Все равно от Ваших постов толку никому нет. )))
...
Рейтинг: 0 / 0
20.12.2017, 16:59:46
    #39572933
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция с цепными расчетами
CammomileТы, условно говоря, хочешь нажать в экселе кнопку "Сделать Расчет" и чтобы сервер все посчитал и вернул данные? .Получается так.
...
Рейтинг: 0 / 0
20.12.2017, 16:59:56
    #39572935
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция с цепными расчетами
ptr128Cammomileпропущено...

Я буду пользоваться только документированными возможностями, готов рискнуть?
Вы флудите дальше. Все равно от Ваших постов толку никому нет. )))
зато от вашего бреда одна польза, чего только xml стоит
...
Рейтинг: 0 / 0
20.12.2017, 17:03:14
    #39572942
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция с цепными расчетами
ferzmikkCammomileТы, условно говоря, хочешь нажать в экселе кнопку "Сделать Расчет" и чтобы сервер все посчитал и вернул данные? .Получается так.
Ну значит с автомобилями я полностью угадал.
Не нужна тебе функция, делай процедуру, в которой описана твоя логика.
ИЛИ несколько процедур.
...
Рейтинг: 0 / 0
20.12.2017, 17:04:20
    #39572944
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пользовательская функция с цепными расчетами
ptr128Вы флудите дальше. Все равно от Ваших постов толку никому нет. )))
Ну т.е. ты влез непонятно зачем с непонятными заявками на мастерство, а когда тебе предложили подтвердить умения рублем, решил сьехать на ля-ля. Яснопонятно.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Пользовательская функция с цепными расчетами / 25 сообщений из 45, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]