Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Какую языковую конструкцию применить  [new]
инопланетянин0001
Guest
Из-за кривой схемы (мопед не мой). При формировании отчетов приходится прибегать к временным таблицам (create table #tmp / insert into #tmp). Вышележащему ПО это надо представить в виде табличной функции.

В Multiline Table Valued запрещено (create table #tmp / insert into #tmp / insert into @tbl exec). Как бы выкрутиться?
20 окт 13, 14:13    [15004371]     Ответить | Цитировать Сообщить модератору
 Re: Какую языковую конструкцию применить  [new]
инопланетянин0001
Guest
инопланетянин0001,

indexed views тоже не катят. там есть self joins. и куй от них избавишься.

щас сделал временно все временные таблицы как cte, но время увеличилось с 5 сек до 12 сек
20 окт 13, 14:23    [15004388]     Ответить | Цитировать Сообщить модератору
 Re: Какую языковую конструкцию применить  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31435
инопланетянин0001
В Multiline Table Valued запрещено (create table #tmp / insert into #tmp / insert into @tbl exec). Как бы выкрутиться?
Таблицы-переменные?
20 окт 13, 15:27    [15004510]     Ответить | Цитировать Сообщить модератору
 Re: Какую языковую конструкцию применить  [new]
ziktuw
Member

Откуда:
Сообщений: 3552
CLR-функции. В них exec не запрещен.
20 окт 13, 21:35    [15005311]     Ответить | Цитировать Сообщить модератору
 Re: Какую языковую конструкцию применить  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
Есть дурацкое решение.

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

По идее можно использовать глобальную таблицу и при многих процессах, но тогда нужно будет добавить поле идентифицирующее процесс и чистить табличку со своим процессом после выполнения.
21 окт 13, 06:15    [15006159]     Ответить | Цитировать Сообщить модератору
 Re: Какую языковую конструкцию применить  [new]
Jaffar
Member

Откуда:
Сообщений: 633
SandalTree,

табличные переменные - однозначно.
21 окт 13, 12:13    [15007187]     Ответить | Цитировать Сообщить модератору
 Re: Какую языковую конструкцию применить  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
Jaffar
SandalTree,

табличные переменные - однозначно.


Если только так:
CREATE FUNCTION dbo.Test ()
RETURNS @Res TABLE(R int)
AS
BEGIN
  DECLARE @r int = 1;
  INSERT INTO @Res(R) SELECT @r;
  INSERT INTO @Res(R) SELECT @r+1;
  INSERT INTO @Res(R) SELECT @r+2;
  RETURN; 
END;
GO
SELECT * FROM dbo.Test();
21 окт 13, 22:42    [15011101]     Ответить | Цитировать Сообщить модератору
 Re: Какую языковую конструкцию применить  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
инопланетянин0001
щас сделал временно все временные таблицы как cte, но время увеличилось с 5 сек до 12 сек
Ага, а с табличной функцией будет ещё 100 раз тормознее.

Может просто нормально CTE написать?

А вообще для отчётов неважно ...
Табличная функция это обычная процедура с табличным интерфейсом:
CREATE FUNCTION dbo.fnReport1 (
	@Param1	Int
,	@Param2	Int
) RETURNS @Result TABLE(
	A Int
,	B Int
) AS BEGIN
	DECLARE	@InternalTable1 TABLE (ID Int PRIMARY Key, Name NVarChar(512))

	INSERT	@Result
	SELECT	ID,2
	FROM	@InternalTable1
RETURN END
GO
DROP FUNCTION dbo.fnReport1
23 окт 13, 15:59    [15021679]     Ответить | Цитировать Сообщить модератору
 Re: Какую языковую конструкцию применить  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
Чёт мне в последнее время кажется что "функции" - зло.

Как только народ научился их использовать то стал их рассматривать как панацею от всех бед.

Всё равно что клистир применять от всех болезней.
23 окт 13, 18:55    [15022749]     Ответить | Цитировать Сообщить модератору
 Re: Какую языковую конструкцию применить  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
SandalTree
Чёт мне в последнее время кажется что "функции" - зло.
Вы только уточняйте термины.
А то да, TSQL скалярки в топку, а табличные (функциональные процедуры) нужны как раз в Enterprise версии, чтобы (временно) обходить некоторые вещи.

В остальном параметризованные представления (inline function) вещь необходимая, как и обычные вью.

И к тому же CLR никто не отменял, да они ещё и вызываются не так как теже скалярки (быстрее).
24 окт 13, 00:39    [15023672]     Ответить | Цитировать Сообщить модератору
 Re: Какую языковую конструкцию применить  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
SandalTree
Как только народ научился их использовать то стал их рассматривать как панацею от всех бед.
Согласен. Но народ всегда выбирает делать через *опу и долго, чем быстро и правильно.
Некоторые вообще кроме процедур больше ничего не знают.
24 окт 13, 00:50    [15023695]     Ответить | Цитировать Сообщить модератору
 Re: Какую языковую конструкцию применить  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
Mnior
SandalTree
Чёт мне в последнее время кажется что "функции" - зло.
Вы только уточняйте термины.
А то да, TSQL скалярки в топку, а табличные (функциональные процедуры) нужны как раз в Enterprise версии, чтобы (временно) обходить некоторые вещи.

В остальном параметризованные представления (inline function) вещь необходимая, как и обычные вью.

И к тому же CLR никто не отменял, да они ещё и вызываются не так как теже скалярки (быстрее).


Я тут на презентации одной был. Дядька рассказывал как они сделали прорыв с функциями.

Вместо обращений к таблицам напрямую юзвери используют функции.

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

Думаю что использовать функции нужно только тогда когда нет другого выхода (то-же относится к вьюхам).

Видел красивое применение функции для якобы реюза кода, но в жизни получается что проще написать новый запрос чем шерстить документацию на предмет уже имеющегося.
24 окт 13, 02:08    [15023794]     Ответить | Цитировать Сообщить модератору
 Re: Какую языковую конструкцию применить  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31435
SandalTree
Mnior
пропущено...
Вы только уточняйте термины.
А то да, TSQL скалярки в топку, а табличные (функциональные процедуры) нужны как раз в Enterprise версии, чтобы (временно) обходить некоторые вещи.

В остальном параметризованные представления (inline function) вещь необходимая, как и обычные вью.

И к тому же CLR никто не отменял, да они ещё и вызываются не так как теже скалярки (быстрее).


Я тут на презентации одной был. Дядька рассказывал как они сделали прорыв с функциями.

Вместо обращений к таблицам напрямую юзвери используют функции.

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

Думаю что использовать функции нужно только тогда когда нет другого выхода (то-же относится к вьюхам).

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

К инлайн функциям и вьюхам это относится намного меньше, но тоже немножко есть...
24 окт 13, 14:00    [15026425]     Ответить | Цитировать Сообщить модератору
 Re: Какую языковую конструкцию применить  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
SandalTree
Вместо обращений к таблицам напрямую юзвери используют функции.
Ну и правильно.
SandalTree
Оно-то конечно проще чем процедуры
Тут дело в использования кода. В интерфейсе конструкции.
Если что-то написано в процедуре, вы эту наработку уже не сможете напрямую использовать в другом запросе.
SandalTree
Думаю что использовать функции нужно только тогда когда нет другого выхода (то-же относится к вьюхам).
Да вы троллите!
Обращаться напрямую к таблам вот это изврат. Вы ещё скажите копировать запросы C&P между процками.
Это Адъ. Трата времени + никакого контроля кода (рефакторинг тон кода очень тяжёлый).

Представления это отражения принципа SoC [Разделение ответственности] (и отчасти SOLID). Есть одна точка, не надо шарить по всему чтобы сделать обзор какой-то сущности и легко делается внутренее изменение, при сохранении внешнего интерфеса.
SandalTree
но в жизни получается что проще написать новый запрос чем шерстить документацию на предмет уже имеющегося.
/facepalm.jpg

Вы совершенно не чувствуете принцип "Что не убивает нас - делает сильней".
Вот смотрите, чел говорит "Переименовать колонку таблы - стоит очень дорого", и пошёл смотреть котиков. Но не успев он посмотреть и парочку из них - код уже был отрефакторен.
Ибо если этим часто заниматься, то делать его становится намного проще и быстрее чем кажется.

Автоматизировать надо не только задачу заказчика, но свою разработку. Всё что вы используете есть автоматизация процесса разработки: Языки, компиляторы, среды разработки, тулзы, плагины, мэнеджмент проектов, эджаил и т.п. - это автоматизация.

Вы просто никогда не пытались писать код правильно. Не надо по привычке смотреть список таблиц. Смотрите сразу список представлений. Сразу делайте на каждую сущность представление. Сразу пишите код в него (расширение), если этот код касается этой сущности. Ничего тут сложно нет. Даже наоборот - быстрее.

Более того, совершенно меняются приоритеты. Изменения становятся приоритетнее "написать/переписать с нуля". Эволюционировать некий продукт с "фатальным недостатком" дешевле чем "переписать правильно".

Какая нафиг дока? Вы просто вместо dbo.tbCustomer пишите dbo.vwCustomer. И всё!. Остальное уже подсказывает интеллисченц, а в параллельном окне можете делать расширение этой сущности, если нужно.

Но я согласен кое в чём, что не так просто - когда надо сделать обзор, тут надо сторонние продукты юзать, дерево зависимостей.
Но тут везде проблема. У всех продуктов MS. И в VisualStudio не посмотреть туже зависимость, к примеру мастер-пейджев в ASP.
Просмотр зависимостей и вообще разнообразные виды просмотров, правильный интерфейс - залог реактивной разработки.

"шерстить на предмет уже имеющегося"?
У вас говно архитектура? Как вы её контролируте? Как вы видите узкие места? Как вы их исправляете?
Контролировать надо не только 20 строк кода вверх и вниз, нужно всё контролить.
А то это смахивает на анекдот "А почему вы ищете под фонарём - тут светлее".
"Почему всё в процках - так проще"? Возьмите фонарик необходимые методы и средства разработки!
24 окт 13, 15:41    [15027217]     Ответить | Цитировать Сообщить модератору
 Re: Какую языковую конструкцию применить  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
alexeyvg
К инлайн функциям и вьюхам это относится намного меньше, но тоже немножко есть...
Смысл другой.
Скалярки, только о них alexeyvg и говорил, работают как вызов, и реально что-то там не доработано.
А вот представления не работают медленнее (так же работают), а компилироваться могут проблематично, если они сильно раздуты.

Так что неправильно говорить "использовать с осторожностью", надо всегда использовать, просто если что, захакать (скопипастить и самому упростить) если вдруг проблемы. Но это бывает крайне редко.
24 окт 13, 15:46    [15027261]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить