GUID из 1С в MS SQL и обратно, как реализовывается?

1. Shaka13 29.08.18 10:03 Сейчас в теме
В 1С ссылки хранятся в БД в бинарном виде, например так 0x898BBCAEC5369A3611E6DC86B0D27F78, а 1С их отдает в виде строки вот так "85cbd3bd-06ec-11e6-a37b-14dae906a3f2", а как реализован этот механизм преобразования туда, а потом обратно?
Так вроде работает: SELECT CONVERT(binary(16), 'b0d27f78-dc86-11e6-898b-bcaec5369a36', 0) AS GUID;, но насколько это точно не знаю.
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. kuzyara 2130 23.05.19 08:30 Сейчас в теме
-- 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
Показать
4. triviumfan 99 25.01.22 12:16 Сейчас в теме
(2) Как её теперь найти в интерфейсе ssms и дать права для определенного пользователя?
3. zhichkin 1539 22.04.20 18:05 Сейчас в теме
Создание функции:

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
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот