从SQL Server检索压缩的GZip信息

时间:2015-07-23 21:05:28

标签: sql sql-server tsql sql-server-2008-r2

我有一个存储压缩GZip文件内容的表。不确定原始信息是XML还是CSV或什么。我无法访问原文。 PulledContent列是varbinary,看起来像0x1F8B08000000000004006553C18E9B3010BD57EA3F706C0F2B63...

如何将此信息转换为人类可读的内容?

我认为解决方案可能就在这里:varbinary to string on SQL Server

但是当我尝试这个时:SELECT CONVERT(VARCHAR(1000), PulledContent, 2);

它只是给我一个稍微不同的数字和字母串,如1F8B08000000000004006553C18E9B3010BD57EA3F70...

我错过了什么?

3 个答案:

答案 0 :(得分:3)

从“PulledContent”列返回的数据采用二进制GZip压缩格式。为了将此二进制数据转换为人类可读格式,您需要执行以下任务。

1)使用适当的库解压缩二进制数据。如果您在Windows环境中,则可以使用.net类GZipStream来执行此任务。

2)将二进制数据转换为字符串。您可以使用.net Encoding类完成此操作。

string data = Encoding.Default.GetString(bytes); 

享受!

答案 1 :(得分:1)

使用最优秀的DotNetZip

,不应该比这复杂得多
static byte[] FetchAndDeCompressData( int key )
{
  using ( SqlConnection connection = new SqlConnection("your-connect-string-here") )
  using ( SqlCommand cmd = connection.CreateCommand() )
  {
    cmd.CommandType = CommandType.StoredProcedure ;
    cmd.CommandText = "dbo.fetch_gzipped_data" ;
    cmd.Parameters.AddWithValue( "@key" , key ) ;
    byte[] bytes = (byte[]) cmd.ExecuteScalar() ;
    return Ionic.Zlib.GZipStream.UncompressBuffer( bytes ) ;
  }
}

使用byte[]解压缩的八位字节做什么取决于它是什么。如果您知道它是文本,您可以通过类似

之类的方式运行它
Encoding.Default.GetString( bytes ) ;

但是你需要知道底层编码是什么。

编辑注: DotNetZip曾经住在Codeplex。 Codeplex已关闭。旧档案仍为available at Codeplex。看起来代码已迁移到Github:

答案 2 :(得分:1)

要解压缩T-SQL中的VARBINARY值(无论是SSMS还是SQL脚本等),您可以使用SQLCLR函数通过简单的SELECT语句进行转换。你可以使用@Doug提到的GzipStream类。

但是,如果您不想编写任何代码来获得此功能,可以在SQL# SQLCLR库的免费版本中找到它(我是其作者,同样,这个功能是免费的)。例如:

SELECT SQL#.Util_GUnzip(PulledContent)
FROM   SchemaName.TableName
WHERE  SomeField = something;

这也将返回VARBINARY值,但它将是未压缩的值。此时,您可以尝试将其转换为各种形式,以查看它到底是什么。二进制文件仍然是二进制文件,但纯文本应该至少部分可读(如果排序规则是正确的编码,则完全可读):

SELECT CONVERT(VARCHAR(MAX), SQL#.Util_GUnzip(PulledContent))
FROM   SchemaName.TableName
WHERE  SomeField = something;

或:

SELECT CONVERT(NVARCHAR(MAX), SQL#.Util_GUnzip(PulledContent))
FROM   SchemaName.TableName
WHERE  SomeField = something;