2015-07-23 2 views
2

У меня есть таблица, в которой хранится содержимое сжатого файла GZip. Не уверен, что исходная информация была XML или CSV или что. У меня нет доступа к оригиналу. Столбец PulledContent является varbinary и выглядит следующим образом: 0x1F8B08000000000004006553C18E9B3010BD57EA3F706C0F2B63...Извлечь сжатую информацию GZip с SQL Server

Как я могу преобразовать эту информацию в нечто, читаемое человеком?

Я думал, что решение может быть здесь: varbinary to string on SQL Server.

Но когда я пытаюсь это: SELECT CONVERT(VARCHAR(1000), PulledContent, 2);

Это просто дает мне немного другой набор цифр и букв, как этот 1F8B08000000000004006553C18E9B3010BD57EA3F70...

Что мне не хватает?

ответ

2

Данные, которые вы возвращаете из столбца «PulledContent», находятся в двоичном сжатом формате GZip. Чтобы преобразовать эти двоичные данные в читаемый человеком формат, вам необходимо выполнить следующие задачи.

1) Раскройте двоичные данные с помощью соответствующей библиотеки. Если вы находитесь в среде Windows, вы можете использовать класс .net GZipStream для выполнения этой задачи.

2) Преобразование двоичных данных в строку. Вы можете выполнить это, используя класс .net Encoding.

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

Наслаждайтесь!

+0

Я должен также добавить что у меня нет доступа к Visual Studio или какой-либо возможности устанавливать новые программы. Я знаю, строго ограничиваю. Я надеялся, что есть способ использовать только SSMS. – pteridoid

+1

@pteridoid Вам не нужна Visual Studio или любая новая программа. У вас уже установлен компилятор csc.exe C#. Вы можете скомпилировать сборки SQLCLR и развернуть их в целевой системе. –

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) ; 

Но вы должны знать, что лежащий в основе кодирования.

1

Чтобы разблокировать значение VARBINARY в T-SQL (будь то в SSMS или SQL-скрипте и т. Д.), Вы можете использовать функцию SQLCLR для выполнения этого перевода с помощью простого оператора SELECT. Вы бы использовали класс GzipStream, о котором упоминалось @Doug.

Но, если вы не хотите писать код для получения этой функции, он доступен в бесплатной версии библиотеки SQLCLR SQL# (которой я являюсь автором, и, опять же, эта функция бесплатна). Например:

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; 
Смежные вопросы