Метод основан на использовании CLR интеграции. ковырялся из любопытства. Может кому пригодятся наработки. MSSQL не ниже 2005 сервера
using System.IO.Compression;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
namespace MysqlFunc
{
public partial class MysqlFunc
{
[SqlFunction()]
public static SqlBytes Sqldeflate(SqlBytes param)
{
DeflateStream deflstrm = new System.IO.Compression.DeflateStream(param.Stream, CompressionMode.Decompress);
return new SqlBytes(deflstrm);
}
[SqlFunction()]
public static SqlBytes Sqlinflate(SqlBytes param)
{
DeflateStream deflstrm = new System.IO.Compression.DeflateStream(param.Stream, CompressionMode.Compress);
return new SqlBytes(deflstrm);
}
}
}
На сервере mssql нужно выполнить следующий скрипт однократно
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'clr enabled', 1;
GO
sp_configure 'CLR strict security', 0; -- это начиная с версии 2019 вроде и нужен потому что не подписывал код
Go
RECONFIGURE;
GO
Это разрешит использование CLR.
теперь подключим наш проект
CREATE ASSEMBLY [SqlMyProj]
AUTHORIZATION [dbo]
FROM 'C:\\vc\\p1\\My.dll' -- указать путь до dll
WITH PERMISSION_SET = SAFE
GO
Далее объявим функции
CREATE FUNCTION [dbo].[CLRdeflate](@inbyte [varbinary](max))
RETURNS [varbinary](max) WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [SqlMyProj].[MysqlFunc.MysqlFunc].[Sqldeflate]
GO
CREATE FUNCTION [dbo].[CLRinflate](@inbyte [varbinary](max))
RETURNS [varbinary](max) WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [SqlMyProj].[MysqlFunc.MysqlFunc].[Sqlinflate]
GO
Итак теперь мы можем использовать наши функции в конструкции
SELECT dbo.CLRdeflate(BinaryData)
FROM dbo.Config
WHERE FileName='000c05d9-cbd7-4ce7-9afc-b4e4378acf16.0' --здесь нужный файл
на mssql начиная с 2019 можно прям там работать с UTF-8
пример
DECLARE @t TABLE(s VARCHAR(MAX) COLLATE Cyrillic_General_100_CI_AS_SC_UTF8);
INSERT INTO @t
SELECT dbo.CLRdeflate(BinaryData)
FROM dbo.Config
WHERE FileName='000c05d9-cbd7-4ce7-9afc-b4e4378acf16.0' --здесь нужный файл или можно все перекодировать
SELECT * FROM @t
теоретически если задать COLLATE при создании базы сразу UTF-8 - можно обойтись простым cast varchar(max)
не знаю, поддерживает ли 1C базы с UTF-8. Не экспериментировал однако =)
Во вложении исходник и скомпилированная dll.
в скрипте не забудьте путь до dll поменять на свой.
компилировал так
%windir%\Microsoft.NET\Framework\v4.0.30319\csc.exe /target:library .\My.cs
в проект легко можно добавить функцию для перекодирования utf-8.
З.Ы. и еще парсер десереализации =)) и потом упаковки в xml ... и посмотреть , мож быстрее 1Cного метода выгрузки конфигурации будет ))