Это то, что вы ищете?
Функция SQLCLR C # ...
using System.Data.SqlTypes;
using System.IO;
using System.IO.Compression;
using System.Linq;
public partial class UserDefinedFunctions
{
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString ZipEntries(SqlBytes data) {
using (var stream = new MemoryStream(data.Value))
using (var archive = new ZipArchive(stream))
return new SqlString(string.Join(",", archive.Entries.Select(e => e.Name)));
}
}
Вот SQL, который я использовал для тестирования.Удивительно, но это сработало ...
-- Create table with ZIP archive column...
CREATE TABLE dbo.ZipImages(ZipArchive VARBINARY(MAX));
GO
-- ... then insert ZIP archive content into the dbo.ZipImages table ...
-- (code not included)
GO
-- ... then prove it works.
SELECT dbo.ZipEntries(ZipArchive) FROM dbo.ZipImages;
GO
Возможно / вероятно, что ваша база данных будет скулить о недоступности System.IO.Compression, в этом случае вы можете попробовать ...
ALTER DATABASE [<your database>] SET TRUSTWORTHY ON;
CREATE ASSEMBLY [System.IO.Compression]
FROM N'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.IO.Compression.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS;
(Если вы не администратор БД, вам захочется быстро подружиться.)
Это, конечно, простой UDF - вы, вероятно, хотите сделать что-то немного другое(например, сделайте UDF CLR на основе таблицы, чтобы возвращать записи по одной).
Если вам нужно открыть файлы из архива в столбце данных, это становится сложнее.Помимо прочего, вам придется добавить System.IO.Compression.File как сборку, которая (к сожалению) НЕ БЕЗОПАСНА и усложняет кучу вещей ...
CREATE ASSEMBLY [System.IO.Compression.FileSystem]
FROM N'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.IO.Compression.FileSystem.dll'
WITH PERMISSION_SET = UNSAFE;