如何将用于BLOB解压缩的C#代码使用T-SQL(SQL Server)复现
实现方案
功能拆解
对应你给出的C#代码,核心逻辑分为3步:
- 丢弃
varbinary类型输入的前4个字节,截取剩余部分 - 对截取后的二进制内容执行Deflate算法解压
- 将解压后的二进制数据按照windows-1251编码转换为字符串
T-SQL 实现说明
你现有代码里的循环完全没有必要,SQL可以直接用内置函数实现字节截取,不需要逐字节遍历。根据你使用的SQL Server版本不同,有两种实现方案:
方案1:使用内置函数(适用SQL Server 2016及以上版本)
SQL Server 2016开始新增的DECOMPRESS内置函数支持Deflate/zlib格式解压,搭配编码转换即可实现需求,完整代码如下:
DECLARE @sqlBinary varbinary(max) -- 这里替换为你实际的BLOB字段/变量 DECLARE @trimmedBinary varbinary(max) DECLARE @decompressedBinary varbinary(max) DECLARE @result varchar(max) -- 第一步:跳过前4个字节,截取剩余内容 SET @trimmedBinary = SUBSTRING(@sqlBinary, 5, DATALENGTH(@sqlBinary) - 4) -- 第二步:执行Deflate解压 SET @decompressedBinary = DECOMPRESS(@trimmedBinary) -- 第三步:按照windows-1251编码(对应SQL代码页1251)转字符串 SET @result = CAST(@decompressedBinary AS varchar(max)) COLLATE SQL_Latin1_General_CP1251_CI_AS -- 输出结果 SELECT @result AS BlobConvertedText
注意:如果解压后内容乱码,说明你存储的Deflate流没有带zlib头,内置
DECOMPRESS无法识别,需要使用方案2的CLR函数实现。
方案2:CLR自定义函数(兼容所有版本,适配无zlib头的Deflate流)
如果内置函数不兼容你的BLOB格式,可以按照C#逻辑编写CLR函数部署到SQL Server中,直接复用你现有的C#代码即可,部署后可以直接在T-SQL中调用该函数处理BLOB字段。
内容的提问来源于stack exchange,提问作者fini
相关产品推荐
相关产品推荐

