|
|
|
Странные возможности Sybase ASE
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Давно хотел спросить, почему ASE позволяет делать некие нестандартные штуки, связанные с агрегирующими функциями. Например: 1. аггрегаты + сортировка select count(*) from table1 order by id возвращает столько count-ов сколько строк в таблице 2. позволяет иметь в запросе с групировкой столбец без аггрегирующей функции и не упомянутый в группировке select count(*),id,mydate from table1 group by mydate выполняется, разворачивая группировку по этому столбцу Ни MS SQL Server, ни Sybase ASA не позволяют таким запросам выполниться, ругаются, о чем собственно и написано в книжках про SQL. Зачем в ASE такое позволено и как это согласовано со стандартами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2006, 11:47 |
|
||
|
Странные возможности Sybase ASE
|
|||
|---|---|---|---|
|
#18+
Трава у дома 2. позволяет иметь в запросе с групировкой столбец без аггрегирующей функции и не упомянутый в группировке select count(*),id,mydate from table1 group by mydate выполняется, разворачивая группировку по этому столбцу Это я тоже сразу заметил есчё на начале моей трудовой деятельности. Хоть такие штуки и часто очень полезны позволяя существенно упростить запрос но иногда, когда выборка делаеться по обединению с нескольких таблиц, то как для меня результат часто непредсказуем если не написать как по стандарту. И "нельзя сметь" в таком случае случайно ошибнутся, например подставить не то имя колонки в списке селект, что и в групбай: "множит" всё что попало и если таблицы большие то моментально забивается лог в tempdb где создаются рабочие таблицы, select lct_admin('abort',0,2) чтобы успеть запустить очистку лога меня не спасает т.к так можно делать и делать.... за то время пока отменятся ждущие транзакции появляються новые и новые..... Но это уже другая история . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2006, 18:52 |
|
||
|
Странные возможности Sybase ASE
|
|||
|---|---|---|---|
|
#18+
... на счёт грамматики (ну типа "есчё".. и т.д.) не обращайте внимание если можно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2006, 18:55 |
|
||
|
Странные возможности Sybase ASE
|
|||
|---|---|---|---|
|
#18+
Трава у домаЗдравствуйте! Давно хотел спросить, почему ASE позволяет делать некие нестандартные штуки, связанные с агрегирующими функциями. ... Ни MS SQL Server, ни Sybase ASA не позволяют таким запросам выполниться, ругаются, о чем собственно и написано в книжках про SQL. Зачем в ASE такое позволено и как это согласовано со стандартами? Потому что "потому" кончается на "У" На самом деле это все одна и та же фича, позволено иметь в запросе с агрегатами колонки , не входящие ни в GROUP BY, ни в агрегатные функции. Это бред, но вот какой-то чудик это придумал давно -- так эта фича и тянется. Никто не знает уже , зачем она, почему она и вообще (включая инженеров Sybase, был на форуме такой вопрос, дооолго они его мурыжили, мы их все склоняли к тому, что это надо запретить ...). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2006, 20:20 |
|
||
|
Странные возможности Sybase ASE
|
|||
|---|---|---|---|
|
#18+
MasterZivЭто бред, но вот какой-то чудик это придумал давно -- так эта фича и тянется. Никто не знает уже , зачем она, почему она и вообще (включая инженеров Sybase, был на форуме такой вопрос, дооолго они его мурыжили, мы их все склоняли к тому, что это надо запретить ...). Действительно правильно сказали: "Баг переходящий из версии в версию становится фичей". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2006, 07:16 |
|
||
|
Странные возможности Sybase ASE
|
|||
|---|---|---|---|
|
#18+
Ведь эта "фича" позволяет просто-напросто получать неправильные результаты. С ужасом обнаружил, что у нас один товарищ ее некоторое время использовал и только недавно он догадался, мол что-то не то Хоть бы они в sp_confugure сделали флажок, позволяющий эту мерзость отключить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2006, 09:28 |
|
||
|
Странные возможности Sybase ASE
|
|||
|---|---|---|---|
|
#18+
Ну вот буквально на днях обнаржуил интересную особенность ASE 12.5.3 begin tran test select 'begin tran', @@trancount save tran test select 'save tran', @@trancount rollback tran test select 'rollback tran 1', @@trancount rollback tran test select 'rollback tran 2', @@trancount rollback tran test select 'rollback tran 3', @@trancount В общем, не хочет он откатывать именованную транзакцию в этом случае :) Обычный rollback tran спокойно пройдет... И ваще, почему select NULL + 'bla' выдает 'bla' и это никак вроде не настраивается? в отличии от MSSQL? (буду рад узнать что я неправ) Так что нелогичностей накопилась уже куча... Печально... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2006, 09:43 |
|
||
|
Странные возможности Sybase ASE
|
|||
|---|---|---|---|
|
#18+
Трава у домаВедь эта "фича" позволяет просто-напросто получать неправильные результаты. С ужасом обнаружил, что у нас один товарищ ее некоторое время использовал и только недавно он догадался, мол что-то не то Хоть бы они в sp_confugure сделали флажок, позволяющий эту мерзость отключить. Если бы только получались неправильные результаты. По факту, добавление колонки, не входящей в GROUP BY, влечет за собой построение декартового произведения результата группировки и исходной таблицы, из которой берется эта колонка. У нас это иногда приводило просто к краху сервера - переполнялся tempdb, все становилось раком и приходилось просто перегружаться. И главное - отловить это никак, кроме тщательной проверки кода глазами, невозможно. Т.е. ошибку сделать тривиально просто, последствия такой ошибки достаточно плачевны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2006, 15:49 |
|
||
|
Странные возможности Sybase ASE
|
|||
|---|---|---|---|
|
#18+
Ну вот буквально на днях обнаржуил интересную особенность ASE 12.5.3 ... В общем, не хочет он откатывать именованную транзакцию в этом случае :) Обычный rollback tran спокойно пройдет... На сколько я помно, на самом деле в ASE нету именованных транзакций. Т.е. можно указать имя транзакции, но использовать никак нельзя. Может я не прав. А для откана на savepoint кажется надо делать rollback to savepoint. И ваще, почему select NULL + 'bla' выдает 'bla' и это никак вроде не настраивается? в отличии от MSSQL? (буду рад узнать что я неправ) Ну а в этом ничего печального нету, на мой взгляд. Это видимо как -то связано с внутренним представлением NULL, что NULL == пустая строка (на стнаницах данных оно так и есть, на сколько я помню). Но это и вполне логично, если у вас где-то NULL случайно затесался, то вся строка не об-null-иться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2006, 15:55 |
|
||
|
Странные возможности Sybase ASE
|
|||
|---|---|---|---|
|
#18+
MasterZiv И ваще, почему select NULL + 'bla' выдает 'bla' и это никак вроде не настраивается? в отличии от MSSQL? (буду рад узнать что я неправ) Ну а в этом ничего печального нету, на мой взгляд. Это видимо как -то связано с внутренним представлением NULL, что NULL == пустая строка (на стнаницах данных оно так и есть, на сколько я помню). Но это и вполне логично, если у вас где-то NULL случайно затесался, то вся строка не об-null-иться. Но всё-таки is null может отличить '' от NULL. Хотя такое поведение ИМХО и удобнее по сравнению со стандартом SQL, но сайбесовцам должно быть стыдно что опции для совместимости нет. Но это пустяки по сравнением с тем, что '' (пустая строка) при конкатенации превращается в ' ' (пробел). Это иногда просто бесит! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2006, 04:36 |
|
||
|
Странные возможности Sybase ASE
|
|||
|---|---|---|---|
|
#18+
Я думаю что внутри у ASE нет пустой строки, есть только NULL и строка с одним пробелом. Поэтому когда вы пишите константу "", это на самом деле " ". Поэтому так и работает. Я все понимаю, я полностью согласен, что поведение нелогично и некорректно, но оно удобно (в смысле NULL) и не такая уж это суперпроблема. Короче, в ASE дофига проблем гораздо серьезнее, это уж можно вытерпеть. И на самом деле многие проблемы решаются в последних версиях, например, большая проблема была с convert() и невозможностью предсказать или перехватить его ошибки. Теперь добавили функции, позволяющие хотя бы предсказать что ошибка будет, без возникновения этой ошибки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2006, 09:15 |
|
||
|
Странные возможности Sybase ASE
|
|||
|---|---|---|---|
|
#18+
Да, коллеги уже задавали вопрос про эту пустую строку. Imho лучшим вариантом было бы введение опций, которые позволили бы использовать старый совместимый режим и стандартный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2006, 09:38 |
|
||
|
Странные возможности Sybase ASE
|
|||
|---|---|---|---|
|
#18+
Еще был интересный случай, когда после реструктуризации таблицы, процедура, обращающаяся к данной таблице и имеющая в своем теле CASE возвращала бред. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2006, 15:05 |
|
||
|
Странные возможности Sybase ASE
|
|||
|---|---|---|---|
|
#18+
Null+строка, для MS SQL SET CONCAT_NULL_YIELDS_NULL Controls whether or not concatenation results are treated as null or empty string values. -------------------------------------------------------------------- Столбцы в select-list, не входящие в агрегаты и не входящие в клаузу group by - очень часто видел в пользователських базах (в основном - в процедурах формирования отчетов). Кстати, принцип формирования резалтсета - не совсем декартово произведение всех таблиц. В запросах с объединением нескольких таблиц в декарт входят таблицы в зависимости от того, в каких клаузах были упомянуты столбцы таблицы - в select list, агрегате, group by, having etc. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2006, 14:12 |
|
||
|
Странные возможности Sybase ASE
|
|||
|---|---|---|---|
|
#18+
Приветствую! Еще один пример из серии парадоксов Код: plaintext 1. 2. 3. 4. получится 'dont match!!' так как получаются NULLы как пустые строки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2007, 11:28 |
|
||
|
Странные возможности Sybase ASE
|
|||
|---|---|---|---|
|
#18+
к тому-же Код: plaintext Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2007, 10:50 |
|
||
|
Странные возможности Sybase ASE
|
|||
|---|---|---|---|
|
#18+
Трава у домаПриветствую! Еще один пример из серии парадоксов Код: plaintext 1. 2. 3. 4. получится 'dont match!!' так как получаются NULLы как пустые строки. Гы, помоему так в сайбейсе всегда и было)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2007, 17:19 |
|
||
|
Странные возможности Sybase ASE
|
|||
|---|---|---|---|
|
#18+
Бесспорно. Но они все равно странные :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2007, 17:31 |
|
||
|
Странные возможности Sybase ASE
|
|||
|---|---|---|---|
|
#18+
Ещё бывает запрос по объедениню нескольких таблиц возвращает задвоенные записи, приходится писать дистинкт там где недолжно быть необходимым.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2007, 16:49 |
|
||
|
Странные возможности Sybase ASE
|
|||
|---|---|---|---|
|
#18+
yourij_mw пишет: > Ещё бывает запрос по объедениню нескольких таблиц возвращает задвоенные > записи, приходится писать дистинкт там где недолжно быть необходимым.. Это как ? пример можно ? Заявление-то серьезное ... Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2007, 18:42 |
|
||
|
Странные возможности Sybase ASE
|
|||
|---|---|---|---|
|
#18+
Таких случаев помню два или три и это было в разных запросах. Последний случай был гдет-то 2 месяца назад. Первоначально в запросе процедуры нестояло ограничения distinct и работал запрос правильно и процедура. Прошло 3-4 месяца и мне сообщили об ошибке вызванной клиентской программой из-за дублирования записей. Результат менно дублируется и у каждой строчки єсть одна парная выглдело примерно как показано ниже. 2554,54845, 0, 47, 1 4578,45272, 0, 47, 1 4487,45674, 0, 47, 1 2554,54845, 0, 47, 1 4578,45272, 0, 47, 1 4487,45674, 0, 47, 1 клал order by и получал 2554,54845, 0, 47, 1 2554,54845, 0, 47, 1 4487,45674, 0, 47, 1 4487,45674, 0, 47, 1 4578,45272, 0, 47, 1 4578,45272, 0, 47, 1 Т.к. к этому времени я с таким случаем уже был знаком сильно не удивлялся но перепроверил несколько раз исходные данные и запрос. Проверял план - ничего необычного не нашёл. Он действительно не должен был возвращать такой результат. Даже проверил тот самый запрос с такими же параметрами (@id_document) на другой базе (это была база одного из подразделениний состоящей в репликаци (АСА) и исходные данные тоже были одинаковыми). Результат исполнения там был правильным. Вот сам и запрос в точности : Код: plaintext 1. 2. 3. 4. 5. 6. PidrozdilFirmy - ID_PidrozdilFirmy тоже ПК SalesOutlet - ID_SalesOutlet - ПК отношения между таблицами один ко многим соответственно. для таблицы ZalyshokTMC - ID_InventoryTag является потенциальным (альтернативным) ключом по которому построен уникальный индекс таким же и являеться столбец ID_Zalyshky для той же таблицы (ZalyshokTMC) по которому тоже стоит уникальный индекс. ПК для ZalyshokTMC здесь не участвует. в таблице Analityka колонка ID_Document имеет обычный индекс ID_Zalyshky также. Есть один индекс на обе (ID_Document,ID_Zalyshky). Важным фактом являэтся то что сегодня запрос без distinct выполняется правильно. Ниже предятавлен план, хотя сказать отличиается он или нет от того который я просматривал тогда немогу. Ещё боллее ранний случай с другим запросом к сожалению очень смутно помню. Пыталься найти по syscomments ту процедуру с "distinct" и не нашёл.. Может попрбую тогда в єтом запросе убрать distinct и как нибудь отловить тот чудесный момент.. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2007, 19:34 |
|
||
|
Странные возможности Sybase ASE
|
|||
|---|---|---|---|
|
#18+
в версии ASE 12.0 следующий запрос Код: plaintext 1. 2. давал ошибку: Must declare variable '@i'. но магия! в версии ASE 15 этот запрос возвращает 555! по поводу чего в сайбейс суппорте сказали: it's an undocumented feature added on version 12.5.4. "We could inherit inside execute immediate variables declared in the outer scope". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2007, 19:59 |
|
||
|
Странные возможности Sybase ASE
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. Фишка вот в чем - даже если переменная @ADSL_BC = NULL, в CASE условие @ADSL_BC is not NULL - Казалось бы, что при данном запросе мы не должны "зайти" в это условие, на деле оказывается наоборот ( проверено на практике ) - Было @ADSL_BC = NULL, и при этом данный подзапрос выдавал ошибку, что пытаемся выбрать в переменную больше 1го значение, тк в таблице было несколько записей с Код: plaintext 1. 2. Что приводило к некорретной работе всего запроса в целом… Поэтому заменили это на след. Условие - чтобы убрать проблему с ID_PSTNStation = NULL, после чего проц. Стала работать нормально. Код: plaintext 1. ИТОГ: Если бы вы использовали условие IF … ELSE … такого бы не произошло, а в случае с CASE будьте внимтельны, потомучто, казалось бы, изначально невалидные условия, кт не должны влиять на выборку, на самом деле могут генерить ошибку и портить конечный результат. Проверяйте подзапросы с CASE с разными входными условиями, и "оборачивайте" параметры в IsNull, как в данном случае или аналогичные, чтобы избежать возможных ошибок! Happy Sybase bug hunting! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2007, 09:40 |
|
||
|
Странные возможности Sybase ASE
|
|||
|---|---|---|---|
|
#18+
Izumov Alex пишет: Код: plaintext 1. 2. 3. 4. 5. 6. 7. У вас очень сбивчевое какое-то письмо получилось. Во-первых, CASE-выражение у вас некорректное синтаксически. Где END ? Во-вторых, у вас нет ELSE в CASE. Если в CASE нет ELSE и ни одно условие не соблюдается, то значение CASE-выражения - NULL. Вы пробовали добавлять в CASE-выражение ELSE ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2007, 12:23 |
|
||
|
Странные возможности Sybase ASE
|
|||
|---|---|---|---|
|
#18+
ПРошу прощения у коллег, за сбивчивость. Старался описать максимально понятно %0 End для CASE есс-но в проц. есть и был... пока копировали - потерялся. А else в данном случае не поможет... проверяли... Вся проблема именно в том, что CASE проверяет все условия незасимо от их ВАЛИДНОСТИ. И в нашем случае в том условии, где было FALSE и кт не должен был выполнять CASE, он его выполнял, и генерил ошибку ( изза того, что Селект возвращал более одного значения.. ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2007, 14:17 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=34116717&tid=2010639]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
167ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 11ms |
| total: | 276ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...