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

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


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