在 SQL Server 中,我可以从保存为 VARBINARY 的 ZIP/RAR 文件中压缩的 XML 中获取数据吗?

问题描述 投票:0回答:1
我有一个表列包含 VARBINARY (数据如 0x...)[列名称是 LDATA]

我只是想简单易懂。 该软件将包含一个 XML 文件的 ZIP/RAR 放入 LDATA 列中。

要访问 XML 文件,我需要按顺序执行这些操作:

    在 SQL Server 中将 varbinary 转换为 base64
  1. 使用该 base64 代码获取 ZIP/RAR 文件(使用在线解码器)
  2. 从 ZIP/RAR 中提取 XML(使用 WinRar)
  3. 然后阅读(使用Notepad++等)
我只想仅使用 SQL Server 读取 XML 文件(不能使用 C# 等)。

可以吗?

提前致谢。

sql-server xml base64 varbinary rar
1个回答
0
投票
您唯一的选择似乎是 SQLCLR 标量函数。

// compile for .NET 4.8 using Microsoft.SqlServer.Server; using System.Data.SqlClient; namespace MySqlClr; public class ZipHelpers { [SqlFunction(IsDeterministic = true, IsPrecise = true)] public static SqlBytes Unzip(byte[] zipped, string? entryName) { using var archive = new ZipArchive(new MemoryStream(zipped), ZipArchiveMode.Read); var entry = archive.Entries.FirstOrDefault(e => entryName == null || entryName == e.Name) ?? throw new Exception("No entries in zip"); using var file = entry.Open(); var ms = new MemoryStream(); file.CopyTo(ms); ms.Position = 0; return new SqlBytes(ms); } }
您需要将其添加为 

UNSAFE

 程序集,这意味着您需要对其进行签名,根据签名创建非对称密钥或证书,然后根据该密钥/证书创建 SQL Server 登录名(而不是用户) ,并授予登录 
UNSAFE ASSEMBLY
 权限。

您还需要首先对

System.IO.Compression

 库执行相同的操作,只不过您可以使用它已有的签名。

然后就可以创建函数并使用它了

CREATE FUNCTION dbo.Unzip(@zipped varbinary(max), @entryName nvarchar(256)) RETURNS varbinary(max) WITH RETURNS NULL ON NULL INPUT AS EXTERNAL NAME [YourAssembly].[MySqlClr.ZipHelpers].[Unzip];
    
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.