Нужно было передать в 1С двоичные данные (varbinary), но как говорится все проблемы на стыке систем. 1С восприняла данные как объект, каковыми они не являлись. Памятуя о том что 1С любит строковые данные, я начал пытаться преобразовать их в строку. И вот что у меня получилось на выходе:
- Использование не документированных функций [sys].[fn_varbintohexstr] и [sys].[fn_varbintohexsubstring]
Если стоит простое преобразование, то можно воспользоваться [sys].[fn_varbintohexstr] , она принимает только один параметр: бинарную переменную.
Вот ее полное описание.
- CREATE FUNCTION [sys].[fn_varbintohexstr]
- (
- @pbinin varbinary(max)
- )
- returns nvarchar(max)
- as
- begin
- return sys.fn_varbintohexsubstring(1,@pbinin,1,0)
- end
* This source code was highlighted with Source Code Highlighter.
[sys].[fn_varbintohexsubstring], в свою очередь имеет более продвинутый функционал. Например, позволяет преобразовывать в строку не всю последовательность, а некую "подстроку". К таким выводам я пришел после просмотра заголовочной части:
- CREATE FUNCTION [sys].[fn_varbintohexsubstring] (
- @fsetprefix bit = 1 -- добавлять '0x' в вывод
- ,@pbinin varbinary(max) -- входной binary поток
- ,@startoffset int = 1 -- начальное смещение
- ,@cbytesin int = 0 -- Длина входной части, 0 означает до конца строки
- )
* This source code was highlighted with Source Code Highlighter.
Со своими коллегами я договорился что им будут отдавать строку вида 0x0123456789, соответственно и мне они будут отдавать уже не в виде строки, а в виде binary, например так:
- INSERT INTO [tab] ([ColBin])
- VALUES (0x0123456789)
* This source code was highlighted with Source Code Highlighter.
- Использование XML запроса.
Вот сразу табличный пример использования:
- ;WITH [cte_d] AS (
- SELECT [ColBin], [sys].[fn_varbintohexstr]([ColBin]) [ColChar] FROM [dbo].[tab]
- )
- select
- cast('' as xml).value('xs:hexBinary( substring(sql:column("ColChar"), 3) )', 'varbinary(max)') [ColBin_xml]
- , '0x' + cast('' as xml).value('xs:hexBinary(sql:column("ColBin") )', 'varchar(max)') [ColChar_xml]
- , [ColBin]
- , [ColChar]
- FROM [cte_d]
* This source code was highlighted with Source Code Highlighter.
- В поле [ColBin_xml] мы плучаем солонку [ColChar] из [cte_d] - команда sql:column("ColChar")
- Дальше берем подстроку от этой колонки начиная с 3-го знака (отрезаем "0x") - функция substring(,,)
- Заставляем xml процессор считать полученую строку как hexBinary
- А в момент возврата данных они интерпретируются как varbinary(max)
- Берем колонку [ColBin] sql:column("ColBin")
- Заставляем процессор считать ее как hexBinary
- И возвращаем как varchar(max)
- И по желанию можно добавить в начало строки "0x"
- Использование MS SQL 2008
Ура, Microsoft реализовал преобразование в рамках функции convert :)
Если у Вас MS SQL 2008 и выше, то вы можете воспользоваться функцией convert. В этом случае она будет принимать 2 или 3 аргумента.
CONVERT ( тип_данных [ ( длина ) ] , выражение [ , стиль ] )
При конвертировании из бинарного представления в строковый мы можем воспользоваться одним из 3-х стилей
- 0 - преобразование в соответствии с ASCII кодами (используется по умолчанию)
- 1 - текстовое представление с добавлением "0x" в начале строки, например так "0x0123456789"
- 2 - текстовое представление без добавленя "0x" в начале строки, например так "0123456789"
- DECLARE @hexbin varbinary(max);
- SET @hexbin = 0x48656C6C6F20576F726C64212121;
- SELECT 1, CONVERT(varchar(MAX), @hexbin)
- union
- SELECT 2, CONVERT(varchar(MAX), @hexbin,1)
- union
- SELECT 3, CONVERT(varchar(MAX), @hexbin,2)
* This source code was highlighted with Source Code Highlighter.
---------------------------------------------------- style result ----------- ---------------------------------------- 0 Hello World!!! 1 0x48656C6C6F20576F726C64212121 2 48656C6C6F20576F726C64212121
- DECLARE @hexstring varchar(max);
- SET @hexstring = '0x48656C6C6F20576F726C64212121';
- SELECT 0 style, CONVERT(varbinary(MAX), @hexstring) result
- union
- SELECT 1, CONVERT(varbinary(MAX), @hexstring,1)
* This source code was highlighted with Source Code Highlighter.
- DECLARE @hexstring varchar(max);
- SET @hexstring = '48656C6C6F20576F726C64212121';
- SELECT 0 style, CONVERT(varbinary(MAX), @hexstring) result
- union
- SELECT 2, CONVERT(varbinary(MAX), @hexstring,2)
* This source code was highlighted with Source Code Highlighter.
----------------------------------------------------------------------------- style result ----------- ----------------------------------------------------------------- 0 0x307834383635364336433646323035373646373236433634323132313231 1 0x48656C6C6F20576F726C64212121
----------------------------------------------------------------------------- style result ----------- ----------------------------------------------------------------- 0 0x34383635364336433646323035373646373236433634323132313231 2 0x48656C6C6F20576F726C64212121
Msg 8114, Level 16, State 5, Line 1 Ошибка при преобразовании типа данных varchar к varbinary.
Комментариев нет:
Отправить комментарий