GUID из 1С в MS SQL и обратно, как реализовывается?
В 1С ссылки хранятся в БД в бинарном виде, например так 0x898BBCAEC5369A3611E6DC86B0D27F78, а 1С их отдает в виде строки вот так "85cbd3bd-06ec-11e6-a37b-14dae906a3f2", а как реализован этот механизм преобразования туда, а потом обратно?
Так вроде работает: SELECT CONVERT(binary(16), 'b0d27f78-dc86-11e6-898b-bcaec5369a36', 0) AS GUID;, но насколько это точно не знаю.
Так вроде работает: SELECT CONVERT(binary(16), 'b0d27f78-dc86-11e6-898b-bcaec5369a36', 0) AS GUID;, но насколько это точно не знаю.
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
-- GUID1C --> binary(16)
declare @GUIDasStr char(36),@GUID1С char(36);
SET @GUID1С = '80AB7036-5D4A-11E6-9903-0050569977A1'
SET @GUIDasStr ='0x'+SUBSTRING(@GUID1С,20,4)+SUBSTRING(@GUID1С,25,13)+SUBSTRING(@GUID1С,15,4)+SUBSTRING(@GUID1С,10,4)+SUBSTRING(@GUID1С,1,8)
SEL ECT CONVERT(binary(16),@GUIDasStr,1) as BinaryGUID
-- binary(16) --> GUID1C (хранимая процедура)
CRE ATE function [dbo].[sp_getid] (@id binary(16))
returns char(36)
as
begin
declare @unidentifier char(36)
declare @charvalue char(36)
select @unidentifier = CONVERT(char(36),CAST(@id as uniqueidentifier))
select @charvalue =
right(@unidentifier, 8)
+ substring(@unidentifier,24,5)
+ substring(@unidentifier,19,5)
+ '-'
+ substring(@unidentifier,7,2)
+ substring(@unidentifier,5,2)
+ '-'
+ substring(@unidentifier,3,2)
+ left(@unidentifier,2)
+ substring(@unidentifier,12,2)
+ substring(@unidentifier,10,2)
+ substring(@unidentifier,17,2)
+ substring(@unidentifier,15,2)
return ( @charvalue )
end;
-- более медленный вариант
CRE ATE FUNCTION dbo.Convert_IDRRefToGUID(@_IDRRef binary(16))
RETURNS VARCHAR(36)
AS
BEGIN
RETURN
substring(substring(sys.fn_varbintohexstr(@_IDRRef),3, len(sys.fn_varbintohexstr(@_IDRRef))),25,8) + ‘-‘ +
substring(substring(sys.fn_varbintohexstr(@_IDRRef),3, len(sys.fn_varbintohexstr(@_IDRRef))),21,4) + ‘-‘ +
substring(substring(sys.fn_varbintohexstr(@_IDRRef),3, len(sys.fn_varbintohexstr(@_IDRRef))),17,4) + ‘-‘ +
substring(substring(sys.fn_varbintohexstr(@_IDRRef),3, len(sys.fn_varbintohexstr(@_IDRRef))),1,4) + ‘-‘ +
substring(substring(sys.fn_varbintohexstr(@_IDRRef),3, len(sys.fn_varbintohexstr(@_IDRRef))),5,12);
END;
--Пример работы функции:
SELECT TOP (5) [_Period], [_Fld517RRef], dbo.sp_getid([_Fld517RRef]) AS GUID
FR OM [dbo].[_InfoRg516]
where [_Fld518RRef]= 0x99030050569977A111E65D4A80AB7036
and [_Period]<CONVERT(datetime2, '01.01.4019')
--Результат выполнения:
_Period _Fld517RRef GUID
4016-08-08 12:40:16 0x8B6F0050569977A111E60D1B75078E17 75078E17-0D1B-11E6-8B6F-0050569977A1
4016-08-08 12:40:16 0x8B6F0050569977A111E610D3CDF12109 CDF12109-10D3-11E6-8B6F-0050569977A1
4016-08-08 12:40:16 0x8B6F0050569977A111E615F5ED3103B6 ED3103B6-15F5-11E6-8B6F-0050569977A1
4016-08-08 12:40:16 0x8B6F0050569977A111E618FEEC1C9706 EC1C9706-18FE-11E6-8B6F-0050569977A1
4016-08-08 12:40:16 0x8B6F0050569977A111E61C801F611143 1F611143-1C80-11E6-8B6F-0050569977A1
-- или так
declare @BinaryGUID binary(16);
SET @BinaryGUID = 0x99030050569977A111E65D4A80AB7036
SELECT dbo.sp_getid(@BinaryGUID) AS GUID
--Результат выполнения:
GUID
80AB7036-5D4A-11E6-9903-0050569977A1
Показать
Создание функции:
CREATE OR ALT ER FUNCTION [dbo].[fn_sql_to_1c_uuid] (*uuid_sql binary(16))
RETURNS nvarchar(36)
AS
BEGIN
DECLARE *uuid_1c binary(16) =
CAST(REVERSE(SUBSTRING(*uuid_sql, 9, 8)) AS binary(8))
+ SUBSTRING(*uuid_sql, 1, 8);
RETURN CAST(CAST(*uuid_1c AS uniqueidentifier) AS nvarchar(36));
END;
Удаление функции:
DR OP FUNCTION IF EXISTS [dbo].[fn_sql_to_1c_uuid];
P.S. Синтаксис SQL Server 2016
CREATE OR ALT ER FUNCTION [dbo].[fn_sql_to_1c_uuid] (*uuid_sql binary(16))
RETURNS nvarchar(36)
AS
BEGIN
DECLARE *uuid_1c binary(16) =
CAST(REVERSE(SUBSTRING(*uuid_sql, 9, 8)) AS binary(8))
+ SUBSTRING(*uuid_sql, 1, 8);
RETURN CAST(CAST(*uuid_1c AS uniqueidentifier) AS nvarchar(36));
END;
Удаление функции:
DR OP FUNCTION IF EXISTS [dbo].[fn_sql_to_1c_uuid];
P.S. Синтаксис SQL Server 2016
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот