Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Подпрограммы в T-SQL  [new]
tunknown
Member

Откуда:
Сообщений: 763
Есть объёмная процедура с повторяющимися участками кода. Для удобства этот код из неё нужно вынести в отдельные функции и другие объекты. Допустим, сделать этого нельзя- объект должен быть строго один. Как можно обособить код для его удобного вызова несколько раз внутри самой процедуры? Пока виден только весьма ограниченный вариант- переоткрываемые курсоры. Временные таблицы не совсем подходят, нужны не данные, но код. Также нежелательно превращать эту процедуру в инсталлятор, создающий функции перед их вызовом.
25 мар 17, 18:22    [20332318]     Ответить | Цитировать Сообщить модератору
 Re: Подпрограммы в T-SQL  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
tunknown, положить в строку и выполнять динамически. Что заведомо выглядит хуже вызова функций.
25 мар 17, 21:58    [20332710]     Ответить | Цитировать Сообщить модератору
 Re: Подпрограммы в T-SQL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
tunknown
Допустим, сделать этого нельзя- объект должен быть строго один.
А почему нельзя, если "объект один"?
Кладёте повторяющийся код внутрь процедуры, и вызываете столько раз, сколько нужно.
25 мар 17, 22:29    [20332768]     Ответить | Цитировать Сообщить модератору
 Re: Подпрограммы в T-SQL  [new]
tunknown
Member

Откуда:
Сообщений: 763
Mike_za
положить в строку и выполнять динамически.
Спасибо, а я не догадался :-(

Mike_za
Что заведомо выглядит хуже вызова функций.
В моём случае это несущественные издержки.

alexeyvg
Кладёте повторяющийся код внутрь процедуры, и вызываете столько раз, сколько нужно.
Сейчас так и есть, но это тяжело поддерживать.
25 мар 17, 22:37    [20332787]     Ответить | Цитировать Сообщить модератору
 Re: Подпрограммы в T-SQL  [new]
iljy
Member

Откуда:
Сообщений: 8711
tunknown
Mike_za
положить в строку и выполнять динамически.
Спасибо, а я не догадался :-(

Mike_za
Что заведомо выглядит хуже вызова функций.
В моём случае это несущественные издержки.

alexeyvg
Кладёте повторяющийся код внутрь процедуры, и вызываете столько раз, сколько нужно.
Сейчас так и есть, но это тяжело поддерживать.


Вы серьезно думаете, что поддерживать динамический код будет легче??
25 мар 17, 23:13    [20332866]     Ответить | Цитировать Сообщить модератору
 Re: Подпрограммы в T-SQL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
tunknown
Допустим, сделать этого нельзя- объект должен быть строго один.
А, я думал, объект - это обрабатываемая таблица...

Да, такого в T-SQL нет.

По моему, вообще ни в каком языке нет, для структурирования кода как раз придумали такие понятия, как процедуры, функции, макросы, в общем, объекты, внешние по отношению к тому месту, где предполагается их использование.
25 мар 17, 23:25    [20332879]     Ответить | Цитировать Сообщить модератору
 Re: Подпрограммы в T-SQL  [new]
GoSub,
Guest
tunknown,

сделать аналог "тёплого, лампового" GoSub/Return из Basic-а, не вариант ?
(с Return правда проблемы есть, но если это "счётное" к-во вызовов, то if-ами можно справиться)

create proc myProc
as
begin
	declare @lbl int
	declare @mySubParam1 int 
	
	select 1
	set @lbl=1; set @mySubParam1=1; goto mySub
l1:	
	select 2
	set @lbl=2; set @mySubParam1=2; goto mySub
l2:	
	select 'end'
	
	return
mySub:
	/* exec sub */
	select 'in mySub' as txt, @mySubParam1 as Param1
	if @lbl=1 goto l1 else if @lbl=2 goto l2 

end
26 мар 17, 10:01    [20333362]     Ответить | Цитировать Сообщить модератору
 Re: Подпрограммы в T-SQL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
GoSub,
сделать аналог "тёплого, лампового" GoSub/Return из Basic-а, не вариант ?
(с Return правда проблемы есть, но если это "счётное" к-во вызовов, то if-ами можно справиться)
Эх, жаль, нет динамического GOTO :-)
26 мар 17, 12:05    [20333568]     Ответить | Цитировать Сообщить модератору
 Re: Подпрограммы в T-SQL  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
tunknown
Для удобства этот код из неё нужно вынести в отдельные функции и другие объекты. Допустим, сделать этого нельзя- объект должен быть строго один. Также нежелательно превращать эту процедуру в инсталлятор, создающий функции перед их вызовом.
Как можно обособить код для его удобного вызова несколько раз внутри самой процедуры?
никак
tunknown
Пока виден только весьма ограниченный вариант- переоткрываемые курсоры
"красота кода" и производительность диаметрально противоположны в t-sql
26 мар 17, 12:39    [20333644]     Ответить | Цитировать Сообщить модератору
 Re: Подпрограммы в T-SQL  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
GoSub,
сделать аналог "тёплого, лампового" GoSub/Return из Basic-а, не вариант ?
не вариант. представляете какой будет план выполнения и рекомпиляции?
26 мар 17, 12:42    [20333648]     Ответить | Цитировать Сообщить модератору
 Re: Подпрограммы в T-SQL  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Дедушка,

Если статистика такая же будет, то с чего рекомпиляции?
26 мар 17, 12:48    [20333659]     Ответить | Цитировать Сообщить модератору
 Re: Подпрограммы в T-SQL  [new]
tunknown
Member

Откуда:
Сообщений: 763
GoSub,
сделать аналог "тёплого, лампового" GoSub/Return из Basic-а, не вариант ?
	if @lbl=1 goto l1 else if @lbl=2 goto l2 
Если меток много- не вариант. Такое есть в cmd/shell.
26 мар 17, 12:50    [20333662]     Ответить | Цитировать Сообщить модератору
 Re: Подпрограммы в T-SQL  [new]
tunknown
Member

Откуда:
Сообщений: 763
iljy
Вы серьезно думаете, что поддерживать динамический код будет легче??
У меня большой опыт:-)
26 мар 17, 12:51    [20333665]     Ответить | Цитировать Сообщить модератору
 Re: Подпрограммы в T-SQL  [new]
tunknown
Member

Откуда:
Сообщений: 763
alexeyvg
Эх, жаль, нет динамического GOTO :-)

Самомодифицируемый код имеет смысл, если среда исполнения позволяет и это не имеет огромного пенальти. Раньше на ассемблере это имело смысл, но у процессоров появился длинный конвеер и кеш инструкций и такая модификация стала его перезагружать за непримлемое число тактов. Аналог- если update syscomments текущей выполняемой процедуры подхватывается и исполнение продолжается без потери текущего положения. Хотя, таблицы перехода в некоторых языках возможны и без самомодифицирумого кода.
26 мар 17, 13:15    [20333696]     Ответить | Цитировать Сообщить модератору
 Re: Подпрограммы в T-SQL  [new]
aleks2
Guest
Тредстартер чудак на букву М.
Свои завиральные идеи пытается выдать за откровение из горящего куста.

В T-SQL есть процедуры.
Вот и пиши процедуры, если надо.
А бред "объект надо оставить один" - это бред и есть.

ЗЫ. Ну или депрессивную возможность [Процедура;N] задействовать.
26 мар 17, 14:28    [20333777]     Ответить | Цитировать Сообщить модератору
 Re: Подпрограммы в T-SQL  [new]
iljy
Member

Откуда:
Сообщений: 8711
tunknown
iljy
Вы серьезно думаете, что поддерживать динамический код будет легче??
У меня большой опыт:-)

Старый, опытный камикадзе?
26 мар 17, 15:34    [20333844]     Ответить | Цитировать Сообщить модератору
 Re: Подпрограммы в T-SQL  [new]
Шыфл
Member

Откуда: Прага
Сообщений: 776
Если код "китайский" - в одной процедуре много типовых вызовов, тогда делай цикл и динамический SQL.

Если код "индуский" - в разных процедурах типовые операции, тогда имеет смысл создать типовую процедуру и дёргать её из разных мест. Внутри она может (но не обязательно) сама быть динамической.
27 мар 17, 15:52    [20337545]     Ответить | Цитировать Сообщить модератору
 Re: Подпрограммы в T-SQL  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Шыфл
Если код "китайский" - в одной процедуре много типовых вызовов, тогда делай цикл и динамический SQL.

Если код "индуский" - в разных процедурах типовые операции, тогда имеет смысл создать типовую процедуру и дёргать её из разных мест. Внутри она может (но не обязательно) сама быть динамической.

типичный пример костыльного мышления.

и да любое универсальное решение работает универсально плохо
27 мар 17, 15:56    [20337565]     Ответить | Цитировать Сообщить модератору
 Re: Подпрограммы в T-SQL  [new]
tunknown
Member

Откуда:
Сообщений: 763
TaPaK
и да любое универсальное решение работает универсально плохо
Либо оно работает приемлемо в данных условиях, либо оно- не решение.
27 мар 17, 21:43    [20338586]     Ответить | Цитировать Сообщить модератору
 Re: Подпрограммы в T-SQL  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5489
Шыфл
Если код "китайский" - в одной процедуре много типовых вызовов, тогда делай цикл и динамический SQL.

Если код "индуский" - в разных процедурах типовые операции, тогда имеет смысл создать типовую процедуру и дёргать её из разных мест. Внутри она может (но не обязательно) сама быть динамической.
А можно подробнее про сорта говнокода? Чем обусловлено это различие?
29 мар 17, 10:57    [20345123]     Ответить | Цитировать Сообщить модератору
 Re: Подпрограммы в T-SQL  [new]
Шыфл
Member

Откуда: Прага
Сообщений: 776
Dmitry V. Liseev
Шыфл
Если код "китайский" - в одной процедуре много типовых вызовов, тогда делай цикл и динамический SQL.
Если код "индуский" - в разных процедурах типовые операции, тогда имеет смысл создать типовую процедуру и дёргать её из разных мест. Внутри она может (но не обязательно) сама быть динамической.
А можно подробнее про сорта говнокода? Чем обусловлено это различие?

Чисто практическое наблюдение, с национальностью программиста мало связанное.
Иногда трудолюбивые программисты вместо циклов копипастят код в простыню, трудолюбивый "китайский" подход.
Иногда интровертные программисты при работе на проекте реализуют один и тот же функционал много раз, зачастую нетривиальным способом. Это "индийский" подход.
Also лурк класиифицирует говнокод подробнее
29 мар 17, 19:11    [20348314]     Ответить | Цитировать Сообщить модератору
 Re: Подпрограммы в T-SQL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
Шыфл
Иногда интровертные программисты при работе на проекте реализуют один и тот же функционал много раз, зачастую нетривиальным способом. Это "индийский" подход.
Я работал с "индуским" программистом.
Длинный код в одну строку, расставленные по коду в произвольных местах цепочки пробелов и табуляций, массовое паст-копи, "интуитивная" логика (типа, для классификации объекта исполдьзует то, что в каком то поле описания есть какая то подстрока, соответственно, при изменении этого описания может перестать работать).
При этом программировал быстро, и быстро разбирался в вычурных запросах клиентов, и работало это правильно (хотя иногда недолго).
29 мар 17, 19:35    [20348382]     Ответить | Цитировать Сообщить модератору
 Re: Подпрограммы в T-SQL  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Один мой знакомый даже гордился тем, какие объемы он копипастит. Говорил - вот это процедурищу написал(!).
30 мар 17, 13:03    [20350516]     Ответить | Цитировать Сообщить модератору
 Re: Подпрограммы в T-SQL  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
Владислав Колосов
Один мой знакомый даже гордился тем, какие объемы он копипастит. Говорил - вот это процедурищу написал(!).
И не удивительно. Например построение похожей отчетности со сложными переливками из табл. в табл. иногда приходится жоско копипастить... :)
Не всегда специфика проекта позволяет юзать уже готовый SQL-код без копипаста.
30 мар 17, 13:29    [20350667]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить