Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: CLR функция для 1С  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 9155
Если писать на C#, то функция очень простая, объявить массив 16 байт и составить строку из его элементов в нужной последовательности.
31 окт 21, 12:46    [22390566]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
L_argo
Member

Откуда:
Сообщений: 1552
select master.dbo.fn_varbintohexstr(MyBinary16Field) as ...
from ...

ЯННП, разве не это нужно ТСу ? Чем не подходит ?
Разве что поднять регистр, если надо.

Не знаю, с какой версии это работает. Вроде как с 2008 работает.
31 окт 21, 22:08    [22390796]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 4434
L_argo
select master.dbo.fn_varbintohexstr(MyBinary16Field) as ...
from ...

ЯННП, разве не это нужно ТСу ? Чем не подходит ?
Разве что поднять регистр, если надо.

Не знаю, с какой версии это работает. Вроде как с 2008 работает.


ЯННПХЕЗБ

fn_varbintohexstr - undocummented unsupported function
1 ноя 21, 12:19    [22390941]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
Двоичник
Member

Откуда: Бобруйск
Сообщений: 356
felix_ff,

Я немного упростил функцию

+
public static class BIN2GUID
{
    [SqlFunction(FillRowMethodName = "getUid_getRow")]
    public static IEnumerable getUid(byte[] c_guid)
    {
        return new UidsRecord[] { new UidsRecord(c_guid) };
    }


    public static void getUid_getRow(object obj, out SqlGuid c_guid)
    {
        UidsRecord o = (UidsRecord)obj;
        c_guid = new SqlGuid(o.c_guid);
    }


    public class UidsRecord
    {
        public byte[] c_guid;

        public UidsRecord(byte[] a_guid)
        {
            formatBytes(a_guid, out c_guid);
        }

        private void formatBytes(byte[] buffer1, out byte[] buffer2)
        {
            buffer2 = new byte[] {
                                   buffer1[15],
                                   buffer1[14],
                                   buffer1[13],
                                   buffer1[12],
                                   buffer1[11],
                                   buffer1[10],
                                   buffer1[9],
                                   buffer1[8],
                                   buffer1[0],
                                   buffer1[1],
                                   buffer1[2],
                                   buffer1[3],
                                   buffer1[4],
                                   buffer1[5],
                                   buffer1[6],
                                   buffer1[7]
            };
        }
    }

}


И

+
[src]select top 1000
				x1.c_guid as fk_agr,
				x2.c_guid as fk_obj,
				x3.c_guid as fk_pgm,
				x4.c_guid as fk_rsk,
				ods.dbo.fn_bin2guid(_Fld7885RRef) as fk_ins,
				ods.dbo.fn_bin2guid(_RecorderRRef) as fk_reg,
				ods.dbo.fn_bin2guid(_Fld7885RRef) as fk_cnt
--				into #tmp1
	from STG.._InfoRg7879 t 
	cross apply ARC..fn_BIN2GUID(_Fld7880RRef) x1
	cross apply ARC..fn_BIN2GUID(_Fld7881RRef) x2
	cross apply ARC..fn_BIN2GUID(_Fld7882RRef) x3
	cross apply ARC..fn_BIN2GUID(_Fld7883RRef) x4
[/SRC]


Чтобы на каждое поле была своя функция.

Может я конечно зря это делаю, но мне думается, так удобней читать.

Однако я не силен Вашу функцию переписать в скалярную... Как это сделать?

Спасибо

Сообщение было отредактировано: 1 ноя 21, 18:36
1 ноя 21, 18:31    [22391136]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32173
L_argo
select master.dbo.fn_varbintohexstr(MyBinary16Field) as ...
from ...

ЯННП, разве не это нужно ТСу ? Чем не подходит ?
Разве что поднять регистр, если надо.
Она же выдаёт совсем другие данные, в другом формате.
select master.dbo.fn_varbintohexstr(0x81791CC1DEEA434311EBC3D76298209B)
0x81791cc1deea434311ebc3d76298209b
--а нужно 
6298209B-C3D7-11EB-8179-1CC1DEEA4343
1 ноя 21, 19:25    [22391160]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
aleks222
Member

Откуда:
Сообщений: 1846
Двоичник
felix_ff,

Я немного упростил функцию

+
public static class BIN2GUID
{
    [SqlFunction(FillRowMethodName = "getUid_getRow")]
    public static IEnumerable getUid(byte[] c_guid)
    {
        return new UidsRecord[] { new UidsRecord(c_guid) };
    }


    public static void getUid_getRow(object obj, out SqlGuid c_guid)
    {
        UidsRecord o = (UidsRecord)obj;
        c_guid = new SqlGuid(o.c_guid);
    }


    public class UidsRecord
    {
        public byte[] c_guid;

        public UidsRecord(byte[] a_guid)
        {
            formatBytes(a_guid, out c_guid);
        }

        private void formatBytes(byte[] buffer1, out byte[] buffer2)
        {
            buffer2 = new byte[] {
                                   buffer1[15],
                                   buffer1[14],
                                   buffer1[13],
                                   buffer1[12],
                                   buffer1[11],
                                   buffer1[10],
                                   buffer1[9],
                                   buffer1[8],
                                   buffer1[0],
                                   buffer1[1],
                                   buffer1[2],
                                   buffer1[3],
                                   buffer1[4],
                                   buffer1[5],
                                   buffer1[6],
                                   buffer1[7]
            };
        }
    }

}


И

+
[src]select top 1000
				x1.c_guid as fk_agr,
				x2.c_guid as fk_obj,
				x3.c_guid as fk_pgm,
				x4.c_guid as fk_rsk,
				ods.dbo.fn_bin2guid(_Fld7885RRef) as fk_ins,
				ods.dbo.fn_bin2guid(_RecorderRRef) as fk_reg,
				ods.dbo.fn_bin2guid(_Fld7885RRef) as fk_cnt
--				into #tmp1
	from STG.._InfoRg7879 t 
	cross apply ARC..fn_BIN2GUID(_Fld7880RRef) x1
	cross apply ARC..fn_BIN2GUID(_Fld7881RRef) x2
	cross apply ARC..fn_BIN2GUID(_Fld7882RRef) x3
	cross apply ARC..fn_BIN2GUID(_Fld7883RRef) x4
[/SRC]


Чтобы на каждое поле была своя функция.

Может я конечно зря это делаю, но мне думается, так удобней читать.

Однако я не силен Вашу функцию переписать в скалярную... Как это сделать?

Спасибо


Умеют же люди на ровном месте громоздить горы говнокода.
1 ноя 21, 19:29    [22391161]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
Двоичник
Member

Откуда: Бобруйск
Сообщений: 356
alexeyvg,

Алексей, помогите пожалуйста сделать скалярную функцию...
Ну вот не лежит у меня к табличной. Может я и зря, но очень хочется попробовать.
Спасибо огромное
1 ноя 21, 20:21    [22391179]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32173
Двоичник
Алексей, помогите пожалуйста сделать скалярную функцию...
Ну вот не лежит у меня к табличной.
А у меня к CLR не лежит душа :-)
1 ноя 21, 21:11    [22391190]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 4434
Двоичник
alexeyvg,

Алексей, помогите пожалуйста сделать скалярную функцию...
Ну вот не лежит у меня к табличной. Может я и зря, но очень хочется попробовать.
Спасибо огромное


Вот когда не будет стоять настроение, тогда уже будет предел
2 ноя 21, 13:47    [22391349]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
L_argo
Member

Откуда:
Сообщений: 1552
alexeyvg
L_argo
select master.dbo.fn_varbintohexstr(MyBinary16Field) as ...
from ...

ЯННП, разве не это нужно ТСу ? Чем не подходит ?
Разве что поднять регистр, если надо.
Она же выдаёт совсем другие данные, в другом формате.
select master.dbo.fn_varbintohexstr(0x81791CC1DEEA434311EBC3D76298209B)
0x81791cc1deea434311ebc3d76298209b
--а нужно 
6298209B-C3D7-11EB-8179-1CC1DEEA4343
Ну хз, что у Вас за формат. Мне нужна была ф-ция для получения SQL аналога.
И эта ф-ция оказалась идентична SQL-написанию. Часто ее применяю при работе с БД из 1С.

Нигде не встречал переставленных дампов, как в примере выше.
Где это применяется ?
6 ноя 21, 17:05    [22392551]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32173
L_argo
Ну хз, что у Вас за формат. Мне нужна была ф-ция для получения SQL аналога.
И эта ф-ция оказалась идентична SQL-написанию. Часто ее применяю при работе с БД из 1С.

Нигде не встречал переставленных дампов, как в примере выше.
Где это применяется ?
Не у меня, а у топикстартера.

Не знаю, где он в 1С нашёл такой формат, я с 1С не работал, но вообще такой формат обсуждается на разных форумах, и тут на SQL.RU тоже был большой топик с обсуждением, возможно даже, что ТС скопировал код, который в первом топике, с нашего форума.
6 ноя 21, 17:14    [22392554]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32173
alexeyvg
и тут на SQL.RU тоже был большой топик с обсуждением, возможно даже, что ТС скопировал код, который в первом топике, с нашего форума.
Вот топик, а там код появился тоже из найденного на SQL.RU :-)
6 ноя 21, 17:16    [22392555]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
L_argo
Member

Откуда:
Сообщений: 1552
alexeyvg
L_argo
select master.dbo.fn_varbintohexstr(MyBinary16Field) as ...
from ...

ЯННП, разве не это нужно ТСу ? Чем не подходит ?
Разве что поднять регистр, если надо.
Она же выдаёт совсем другие данные, в другом формате.
select master.dbo.fn_varbintohexstr(0x81791CC1DEEA434311EBC3D76298209B)
0x81791cc1deea434311ebc3d76298209b
--а нужно 
6298209B-C3D7-11EB-8179-1CC1DEEA4343
ну тогда так:
CREATE FUNCTION GetBin16To1C
(
 @bin16 binary(16)
)
returns char(36)
BEGIN
declare @res char(36)

select @res = master.dbo.fn_varbintohexstr(@bin16)
select @res = substring(@res,27,8)+'-'+
              substring(@res,23,4)+'-'+ 
              substring(@res,19,4)+'-'+
              substring(@res,3,4) +'-'+
              substring(@res,7,12)
     
return @res
END
Это написание встречается в 1С-ных XML выгрузки конфигурации.
23 ноя 21, 11:36    [22399575]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
aleks222
Member

Откуда:
Сообщений: 1846
L_argo
alexeyvg
пропущено...
Она же выдаёт совсем другие данные, в другом формате.
select master.dbo.fn_varbintohexstr(0x81791CC1DEEA434311EBC3D76298209B)
0x81791cc1deea434311ebc3d76298209b
--а нужно 
6298209B-C3D7-11EB-8179-1CC1DEEA4343
ну тогда так:
CREATE FUNCTION GetBin16To1C
(
 @bin16 binary(16)
)
returns char(36)
BEGIN
declare @res char(36)

select @res = master.dbo.fn_varbintohexstr(@bin16)
select @res = substring(@res,27,8)+'-'+
              substring(@res,23,4)+'-'+ 
              substring(@res,19,4)+'-'+
              substring(@res,3,4) +'-'+
              substring(@res,7,12)
     
return @res
END
Это написание встречается в 1С-ных XML выгрузки конфигурации.


Так
CREATE function [dbo].[getId](@id binary(16)) 
RETURNS TABLE 
AS
RETURN ( select id = convert(char(36), cast( cast( reverse(cast(substring(@id, 9, 8) as char(8)) ) as binary(8) ) + substring(@id, 1, 8) as uniqueidentifier) , 2) )

бодрее в разы.
23 ноя 21, 15:19    [22399717]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
selis76
Member

Откуда:
Сообщений: 407
Вот тут очень подробное описание про устройство Guid UUID и представление Ссылки в 1С и варианты конвертации
https://infostart.ru/1c/articles/635159/
В топике не описали задачу ради которой хотите конвертировать ссылку в guid причем быстро. Как правило guid нужны в чистом виде только для планов обмена 1С но там они управляются средствами 1С, а все трюки с предоставлением данных через View SQL Server архитектурно ограничены

Сообщение было отредактировано: 25 ноя 21, 12:27
25 ноя 21, 12:26    [22400627]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Microsoft SQL Server Ответить