GZip CLR Functions
Looks like SQL Server 2016 finally introduced a COMPRESS function. If you’re not quite there yet, then you can build a CLR function to compress/decompress data using GZip.
using System.Data.SqlTypes; using System.IO; using System.IO.Compression; using System.Text; using Microsoft.SqlServer.Server; public partial class UserDefinedFunctions { [SqlFunction] public static SqlBytes GZipString(SqlString value) { using (var inputStream = new MemoryStream(Encoding.UTF8.GetBytes(value.Value))) { using (var outputStream = new MemoryStream()) { Compress(inputStream, outputStream); return new SqlBytes(outputStream.ToArray()); } } } [SqlFunction] public static SqlBytes GZipBinary(SqlBytes value) { using (var inputStream = new MemoryStream(value.Value)) { using (var outputStream = new MemoryStream()) { Compress(inputStream, outputStream); return new SqlBytes(outputStream.ToArray()); } } } [SqlFunction] public static SqlString GUnZipToString(SqlBytes value) { using (var inputStream = new MemoryStream(value.Value)) { using (var outputStream = new MemoryStream()) { Decompress(inputStream, outputStream); return new SqlString(Encoding.UTF8.GetString(outputStream.ToArray())); } } } [SqlFunction] public static SqlBytes GUnZipToBinary(SqlBytes value) { using (var inputStream = new MemoryStream(value.Value)) { using (var outputStream = new MemoryStream()) { Decompress(inputStream, outputStream); return new SqlBytes(outputStream.ToArray()); } } } private static void Compress(Stream inputStream, Stream outputStream) { using (var gzip = new GZipStream(outputStream, CompressionMode.Compress)) { byte[] buffer = new byte[8192]; int count; while ((count = inputStream.Read(buffer, 0, buffer.Length)) > 0) { gzip.Write(buffer, 0, count); } } } private static void Decompress(Stream inputStream, Stream outputStream) { using (var gzip = new GZipStream(inputStream, CompressionMode.Decompress)) { byte[] buffer = new byte[8192]; int count; while ((count = gzip.Read(buffer, 0, buffer.Length)) > 0) { outputStream.Write(buffer, 0, count); } } } }
Comments
Post a Comment