seajey: Electronic Knight (Default)
Как-то столкнулся с необходимостью, в процедуре, задать порядок сортировки результирующего запроса через входящую переменную. Динамический SQL - не выход, а другого способа, кроме как лесенки IF'ов и множественного повторения SELECT'а не придумалось.

Задача возникла снова, и в этот раз получилось найти более лаконичный, в тоже время вполне понятный вариант. И так:

DECLARE @SortDirection dShortString SET @SortDirection = 'DESC' 

SELECT * 
FROM wlmUsers
ORDER BY 
CASE 
    WHEN @SortDirection = 'ASC' 
        THEN wlmUserID 
END ASC,
CASE    
    WHEN @SortDirection = 'DESC' 
        THEN wlmUserID 
END DESC
seajey: Electronic Knight (Default)
Недавно выяснил интересный момент: если табличная функция возвращает большое количество записей и нам в последствии нужно делать JOIN к другим таблицам, то предпочтительней использовать следующий метод.

Создаём временную таблицу:

CREATE #WorkingTable TABLE
(
ID int,
Value float
)

Создаём кластерный индекс по таблице:

CREATE CLUSTERED INDEX #table_index1 ON #WorkingTable(ID)

Забираем данные из табличной функции:

INSERT INTO #WorkingTable
(
ID,
Value
)
SELECT
f.ID,
f.Value
FROM dbo.fSelectData(@inID) AS f

Делаем итоговую выборку с джойном на нужный справочник:

SELECT
st.FullDescription,
wt.Value
FROM #WorkingTable AS wt
INNER JOIN SomeTable AS st ON st.ID = wt.ID

Правда, на мой наивный взгляд, заморачиваться с отдельной временной таблицей стоит, только если табличная функция выдаёт большой объём данных (десятки тысяч записей и больше).
seajey: Electronic Knight (Default)
Есть у нас хороший клиент, активных пользователь БизнесМенеджерАгро - основного продукта enterprice-части Wilmark'а. Сейчас у них, в связи с объединением с другой компанией, тоже нашего клиента, кстати, большие пертурбации, в том числе и со стандартом отчётности. В процессе перехода к новому формату они заказали нам серию отчётов на начисление различных расходов. Среди них есть отчёт, выдающий расчётные тарифы на перевозку ж/д транспортом реализованного товара.

Тарифные ставки для него берутся из паспорта сделки. И вот, внезапно, ставки глобально поменялись. И сей неприятный факт нужно учесть. Старый механизм уже не работает, замену мы ещё не успели перенести - и дело это не быстрое, а отчётность требуется прямо сейчас. Конечно, всегда можно поправить данные в паспорте сделки, но по разным соображениям, это неудобный и непродуктивный вариант.

Среди артефактов в системе был найден доселе неиспользуемый справочник с характерным названием "Ж/д тарифы" - по сути это табличка в базе со станцией отправки, станцией назначения и тарифом на перевозку между ними. На первое время сойдёт, а там уже нормальный блок маршрутов на подходе.
В-общем, я думал, что придётся поломать голову и повыдирать волосьев, но реальность оказалась не такой безрадостной.
Read more... )
seajey: Electronic Knight (Default)
Еще парочка простых, но полезных финтов. 1. Есть запрос к реальной клиентской базе: SELECT ArticleName FROM Articles WHERE isTotal <> 1 В результате артикулов возвращается 28 штук, хотя всего в базе 4605 различных артикулов. Проблема в том, что в большинстве записей в поле isTotal забито значение NULL, что суть есть отсутствие значения. Поэтому в условие нужно доработать: WHERE isTotal <> 1 OR isTotal IS NULL Либо применить такую конструкцию: ISNULL(isTotal, 0) <> 1 В итоге меньше символов и без заморочек со скобочками, если понадобится добавить ещё одно условие. 2. Допустим есть некий сложный запрос: SELECT Foo FROM Bar WHERE isFoo = 1 Мы его прооптимизировали и теперь он работает существенно быстрей. Но чтобы убедиться, что результат выдачи не изменился можно сделать так: SELECT Foo FROM Bar WHERE isFoo = 1 INTERSECT SELECT Foo FROM Bar WHERE isFoo = 1
seajey: Electronic Knight (Default)
Так НЕ работает, хотя казалось бы всё логично: DECLARE @RowsNumber int = 10; SELECT TOP @RowsNumber * FROM ShopSales Но стоит только добавить волшебных скобочков: DECLARE @RowsNumber int = 10; SELECT TOP (@RowsNumber) * FROM ShopSales SQL Server вдруг сразу же начинает понимать, что от него требуется.

Profile

seajey: Electronic Knight (Default)
SeaJey

September 2013

S M T W T F S
123456 7
8 910 11121314
15161718192021
22232425262728
2930     

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 23rd, 2017 10:42 am
Powered by Dreamwidth Studios