powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Микрооткрытие. Некорректная работа Len() с Varbinary
6 сообщений из 6, страница 1 из 1
Микрооткрытие. Некорректная работа Len() с Varbinary
    #32016349
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я работаю с древовидными структурами. Идентификаторы записей имеют тип 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() взял на заметку.
И заметку эту постирую на форуме - может, кому-то еще пригодится.
...
Рейтинг: 0 / 0
Микрооткрытие. Некорректная работа Len() с Varbinary
    #32016350
Фотография Александр Гладченко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Микрооткрытие. Некорректная работа Len() с Varbinary
    #32016361
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Адександру Гладченок спасибо за ссылочку. Ранее я ее проворонил.
И небольшая поправочка. Некорректная длина строки varbinary возвращается при хвостовых байтах, содержащих не нули, а код 20 шестнадцатиричное (то есть код пробела).
...
Рейтинг: 0 / 0
Микрооткрытие. Некорректная работа Len() с Varbinary
    #32016369
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну почему же некорректная?

LEN
Returns the number of characters, rather than the number of bytes, of the given string expression, excluding trailing blanks .
...
Рейтинг: 0 / 0
Микрооткрытие. Некорректная работа Len() с Varbinary
    #32016384
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ф-ция datalength() не поможет?
...
Рейтинг: 0 / 0
Микрооткрытие. Некорректная работа Len() с Varbinary
    #32016394
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
datalength() - то что надо! Спасибо.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Микрооткрытие. Некорректная работа Len() с Varbinary
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]