Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Глюк с varbinary / 2 сообщений из 2, страница 1 из 1
20.08.2001, 11:21
    #32012232
Garya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюк с varbinary
В таблице хранится дерево. В качестве идентификаторов используются uniqueidentifier. Требуется быстро определять путь от корня дерева до любой записи. Для чего используется дополнительное поле varbinary(320), в которое триггером при добавлении новой записи автоматом прописываются сконкатенированные идентификаторы всех родителей до корня дерева (по 16 байт на 1 идентификатор). Далее пытаюсь по нескольким по первым байтам этого поля отфильтровать все записи, которые входят в поддерево, вершина которого задана определенным идентификатором. И тут наступают полные дрова!
При применении функции LEFT() к полю varbinary результат преобразуется к VARCHAR(). Это еще как-то понятно. Но то, что происходит дальше, просто не лезет ни в какие ворота. Преобразуется все чего ни попадя ко всему, чего ни попадя. Вообще, обращение к varbinary ломает запросы ко всем чертям даже тогда, когда не должно происходить преобразование типа вообще. Пример:
select 'a', BinPath from MyTable - работает нормально. А вот такой запрос:
select BinPath, 'a' from MyTable - вместо 'a' выводит полную белиберду (в виде четырех псевдографических символов).
select Len(BinPath), BinPath from MyTable - работает нормально
select BinPath, Len(BinPath) from MyTable - вместо чисел в некоторых строчках полная белиберда из хаотического нагромождения псевдографики и прочих алфавитных символов (не цифр!), причем такой длины, что число с таким количеством значащих цифр может означать лишь расстояние между галактиками в миллиметрах.
Ну а началось все с того, что обнаружил, что длина поля, определяемая функцией Len() после неявного преобразования в varchar и явного обратно в varbinary вдруг почему-то уменьшается на 1. Просто запустил запрос, чтобы убедиться, что преобразование varbinary в varchar и обратно проходит без искажений и является обратимым:
select * from MyTable where cast(Left(BinPath, Len(BinPath)) as varbinary(320)) != BinPatch
Этот запрос вернул все записи! Оказалось, что в процессе преобразования туда - сюда потерялся один последний байт и у результата выражения длина уменьшилась на 1.
Стоит у меня сервиспак на SQL-2000. Может быть, не стОило ставить?
...
Рейтинг: 0 / 0
20.08.2001, 12:23
    #32012241
ChA
ChA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюк с varbinary
Попробуйте вместо LEFT использовать SUBSTRING, в отличие от первого второй работает и с бинарными данными.
А вообще, если я правильно помню(%90) однозначный перевод между varchar и varbinary невозможен, во что Вы,
и наступили
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Глюк с varbinary / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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