Имя: Пароль:
1C
1С v8
Изменилась сортировка после перехода на MS SQL
,
0 Gsoom2010
 
13.12.12
21:50
Добрый день.

До недавнего времени база работала в файловом варианте, недавно перевели на MS SQL 2008 EXPRESS и обнаружилась следующая вещь:

У меня в документе есть таблица значений (ссылки на другие документы):
1. Документы №1
1 Gsoom2010
 
13.12.12
21:52
2. Документ № 2
3. Документ № 3

Я делаю отчёт из документа получая во временную таблицу список этих документов, а после левым соединением вытягиваю по этим документам прочую информацию
2 Gsoom2010
 
13.12.12
21:52
В файловом варианте в таком отчёте сохранялся порядок следования документов как он был изначально, но после перехода на MS SQL порядок в отчёте сбивается.
3 Gsoom2010
 
13.12.12
21:53
Если в файловом я получал в отчёте:
1. Документ 1
2. Документ 2
3. Документ 3

то в SQL получаю не обязательно такой порядок
4 Gsoom2010
 
13.12.12
21:54
А порядок в этом отчёте очень важен, поэтому вопрос - куда смотреть чтобы найти как оставить порядок без изменений
5 H A D G E H O G s
 
13.12.12
21:54
Текст запроса.
6 МихаилМ
 
13.12.12
21:55
бывает такое.
collation ms sql ? рег настройки ?
7 Gsoom2010
 
13.12.12
21:55
Сам запрос:

   МенеджерВТ = Новый МенеджерВременныхТаблиц;
   
   Запрос = Новый Запрос;
   
   Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
   
   Запрос.Текст = "  
       |ВЫБРАТЬ
       |    Таблица.Накладная как Документ
       |ПОМЕСТИТЬ ВременнаяТаблица
       |ИЗ
       |    &Таблица КАК Таблица";
       
   // Устанавливаем таблицу
   Запрос.УстановитьПараметр("Таблица", ГрузовыеНакладные);
       
   // Выполняем запрос
   Запрос.Выполнить();
   
   Запрос.Текст = "
       |ВЫБРАТЬ
       |    ВременнаяТаблица.Документ
       |    Прочие данные по документу
       |ИЗ
       |    ВременнаяТаблица КАК ВременнаяТаблица
       |        ЛЕВОЕ СОЕДИНЕНИЕ
       |        РегистрСведений.КэшГрузовыхНакладных КАК КэшГрузовыхНакладных
       |        ПО
       |        ВременнаяТаблица.Документ.Ссылка = КэшГрузовыхНакладных.Накладная.Ссылка
       |
       |ИТОГИ
       |    СУММА(СтоимостьГруза)
       |ПО
       |    ОБЩИЕ";
8 Gsoom2010
 
13.12.12
21:56
(6) Я с MS SQL никогда ранее не работал, только два дня как перевёл базу "попробовать" так что не совсем понимаю что вы спрашиваете
9 Александр_
Тверь
 
13.12.12
21:57
(8) в случае, когда порядок сортировки не задан явно, строки будут выводиться в произвольным образом. Точка.
В твоем случае, нужно добавить сортировку.
10 Живой Ископаемый
 
13.12.12
21:58
2(7) Так тут же нет сортировки?
Что теперь нужно?
11 H A D G E H O G s
 
13.12.12
21:59
(9) Нет.
12 Gsoom2010
 
13.12.12
21:59
Дело в том что мне важно сохранить сортировку как в документе, может быть есть обходные пути?
13 H A D G E H O G s
 
13.12.12
21:59
ВременнаяТаблица.Документ.Ссылка = КэшГрузовыхНакладных.Накладная.Ссылка

заменить на

ВременнаяТаблица.Документ = КэшГрузовыхНакладных.Накладная
14 Александр_
Тверь
 
13.12.12
21:59
(12) добавь номер строки во временную таблиц и по ней сортируй.
15 Gsoom2010
 
13.12.12
22:00
(14) гениально
16 H A D G E H O G s
 
13.12.12
22:00
Забавно, никогда не проверял, кто будет "сильнее" в случае соединения 2-х таблиц.
17 Gsoom2010
 
13.12.12
22:00
Извиняюсь за тупняк
18 H A D G E H O G s
 
13.12.12
22:00
(9) РС будет сортироваться в зависимости от TableScan/ IndexScan
19 H A D G E H O G s
 
13.12.12
22:01
И вот скорее всего он "утягивает" за собой ТЗ
20 Gsoom2010
 
13.12.12
22:01
(19) Спасибо за помошь
21 Александр_
Тверь
 
13.12.12
22:02
(18) т.е. ты сможешь автору гарантировать, что его отчет будет выводиться в нужном порядке, без применения явной сортировки?
22 H A D G E H O G s
 
13.12.12
22:03
(21) Нет конечно. Я просто говорю, что не "строки будут выводиться в произвольным образом", а в зависимости от TableScan/ IndexScan
23 H A D G E H O G s
 
13.12.12
22:04
(20) Не забудь про (13)
24 Нуф-Нуф
 
13.12.12
22:04
нигде нет сортировки. какие могут быть вопросы?
25 Александр_
Тверь
 
13.12.12
22:05
(22) хех...
естественно, что они будут выводиться не рандомно, а подчиняясь какому-то внутреннему алгоритму. Но сточки зрения прикладного программиста это будет рандомно. ИМХО самым правильным подходом будет - явно задать критерий сортировки.
26 Нуф-Нуф
 
13.12.12
22:05
(22) каким боком тут твое TableScan/ IndexScan
27 Gsoom2010
 
13.12.12
22:06
(23) Да уже заменил
(21) Добавил в ВТ номер строки и по нему сортирую конечный результат, всё работает, спасибо!
28 H A D G E H O G s
 
13.12.12
22:06
(26) Иди почитай немного хорошей, олдскульной теории.

http://www.sql.ru/articles/mssql/03013101indexes.shtml#9
29 Александр_
Тверь
 
13.12.12
22:08
(27) ты, кстати, про пакетные запросы слышал?
Так, как ты написал (явное использование менеджера временных таблиц) может быть востребовано в ограниченном количестве случаев. Лучше с точки зрения наглядности (а так же быстродействия) использовать пакетный запрос.
30 Gsoom2010
 
13.12.12
22:13
(29) Не не слышал, сейчас почитаю
31 Gsoom2010
 
13.12.12
22:16
(29) Спасибо за подсказку, на днях буду переписывать на пакетный запрос.
32 ShoGUN
 
13.12.12
22:55
(26) в (18) Всё правильно написано, другое дело, что в другой СУБД порядок теоретически может измениться. Если сортировка явно не оговорена, то строки просто выдаются в том же порядке, в котором были получены СУБД из базы.
Закон Брукера: Даже маленькая практика стоит большой теории.