Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Микрооткрытие. Некорректная работа Len() с Varbinary
|
|||
|---|---|---|---|
|
#18+
Я работаю с древовидными структурами. Идентификаторы записей имеют тип uniqueidentifier. Для того, чтобы можно было во VIEW без существенных тормозов выбрать поддерево записей, заданное ID записи-вершины поддерева, я во вспомогательном столбе у каждой записи сохраняю путь к этой записи от корня дерева. Путь сохраняется в поле varbinary(360). В него укладываются по порядку идентификаторы записей, начиная от корня дерева с преобразованием cast(UniqueidentifierVar as varbinary(16)), которые сцепляются конкатенацией. Для того, чтобы отобрать поддерево, вершину которого образует запись с заданным ID, я использовал такую конструкцию: ... where TopRecord.Path+cast(TopRecord.ID as varbinary(16))=Substring(AllRecords.Path,1, Len(TopRecord.Path)+16)) Подобная конструкция работает, но, как выяснилось, не во всех случаях. После тщательных разборок выяснилось, что Len(Path), которая обязана возвращать значения кратные 16, возвращает их иногда на единичку меньше. Происходит это тогда, когда поле Varbinary заканчивается нулевым байтом. Самое интересное, что конкатенация работает корректно (хвостовой нулевой байт не пропадает, если к "строке" varbinary прицепить еще что-нибудь). Выкрутиться я выкрутился. Слава богу, есть еще одно поле - номер уровня в дереве: ... where TopRecord.Path+cast(TopRecord.ID as varbinary(16))=Substring(AllRecords.Path,1, (TopRecord.[Level]+1)*16) Но замысловатое поведение функции Len() взял на заметку. И заметку эту постирую на форуме - может, кому-то еще пригодится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2001, 17:38 |
|
||
|
Микрооткрытие. Некорректная работа Len() с Varbinary
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2001, 17:58 |
|
||
|
Микрооткрытие. Некорректная работа Len() с Varbinary
|
|||
|---|---|---|---|
|
#18+
Адександру Гладченок спасибо за ссылочку. Ранее я ее проворонил. И небольшая поправочка. Некорректная длина строки varbinary возвращается при хвостовых байтах, содержащих не нули, а код 20 шестнадцатиричное (то есть код пробела). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2001, 08:22 |
|
||
|
Микрооткрытие. Некорректная работа Len() с Varbinary
|
|||
|---|---|---|---|
|
#18+
Ну почему же некорректная? LEN Returns the number of characters, rather than the number of bytes, of the given string expression, excluding trailing blanks . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2001, 09:01 |
|
||
|
Микрооткрытие. Некорректная работа Len() с Varbinary
|
|||
|---|---|---|---|
|
#18+
А ф-ция datalength() не поможет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2001, 10:27 |
|
||
|
|

start [/forum/search_topic.php?author=flankerr&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
get settings: |
5ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
44ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
2ms |
| others: | 704ms |
| total: | 850ms |

| 0 / 0 |
