保存.zip文件到BLOB在SQL Server

问题描述:

我必须这样做:保存.zip文件到BLOB在SQL Server

  1. 借此@HTML并保存到文件example.txt
  2. example.txt保存到.zip与密码
  3. .zip文件转换成团块并存储到表

你知道怎么做只有在T-SQL?可能吗?

DECLARE @HTML varchar(200) 

    SET @HTML = '<html> 
    <META http-equiv=Content-Language content=pl> 
    <META http-equiv=Content-Type content="text/html; charset=iso-8859-2"> 
    <body style="color:black; font-family: verdana, arial, helvetica, sans-serif; font-size:11px;"> 
    TEST</body></html>' 

    SELECT @HTML 

使用类似的东西?

EXEC sp_OACreate 'ADODB.Stream', @ObjectToken OUTPUT 
    EXEC sp_OASetProperty @ObjectToken, 'Type', 1 
    EXEC sp_OAMethod @ObjectToken, 'Open' 
    EXEC sp_OAMethod @ObjectToken, 'Write', NULL, @IMG_PATH 
    EXEC sp_OAMethod @ObjectToken, 'SaveToFile', NULL, @TIMESTAMP, 2 
    EXEC sp_OAMethod @ObjectToken, 'Close' 
    EXEC sp_OADestroy @ObjectToken 

OK我创造了这个:

using System; 
using System.Collections.Generic; 
using System.Data.SqlTypes; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Data.SqlClient; 
using Microsoft.SqlServer.Server; 

namespace SaveBlobData 
{ 
    class SaveHTML 
    { 
     [Microsoft.SqlServer.Server.SqlProcedure] 
     public static void SaveBlob(out SqlInt32 value, int idZak) 
     { 
      value = 3 + idZak; 
     } 
    } 
} 

我添加.dll但我得到的错误,当我选择这个选项。问题在哪里?

enter image description here

+0

看起来像家庭作业:)和...'example.txt'已经存在,或者你必须通过t-sql创建它?什么将用于创建zip-archive 7-zip,winrar ...? – gofr1

+0

我必须从@HTML中的这段文字创建example.txt –

  1. 参加此@HTML并保存到example.txt中

文件这部分可以使用OLE自动化对象

DECLARE @FSO int, 
     @oFile int, 
     @filename nvarchar(max) = 'c:\Folder\example.txt' 

-- Create OLE Automation Object 
EXEC sp_OACreate 'Scripting.FileSystemObject', @FSO OUT 

-- Create file 
EXEC sp_OAMethod @FSO, 'CreateTextFile', @oFile OUT, @filename, 8 , True 

-- Write data 
EXEC sp_OAMethod @oFile, 'Write', NULL, @HTML 

-- Clear used objects 
EXEC sp_OADestroy @FSO 
EXEC sp_OADestroy @oFile 
  1. 例子。 txt用密码保存到.zip
  2. 不知道如何用t-sql来完成,为此我们使用p owershell(或CMD):

    # path to 7-zip 
    $zip = "C:\Program Files\7-Zip\7z.exe" 
    # file 
    $FilesArh = "c:\Folder\example.zip" 
    $Dir = "c:\Folder\example.txt" 
    &$zip a "$FilesArh" "$Dir" 
    

    与此内部创建文件Test1.ps1

    param 
    (
    [String] $FilesArh, 
    [String] $Dir 
    ) 
    # path to 7-zip 
    $zip = "C:\Program Files\7-Zip\7z.exe" 
    &$zip a "$FilesArh" "$Dir" 
    

    启动它从SQL Server:

    EXEC xp_cmdshell 'powershell C:\Folder\Test.ps1 "c:\Folder\example.zip" "c:\Folder\example.txt"' 
    
    1. 。zip文件转换为blob并放到表中:
    2. With OPENROWSET您可以获取BLOB数据并将其插入到表中。

      INSERT INTO your_table (BLOB_field) 
      SELECT * 
      FROM OPENROWSET(BULK 'c:\Folder\example.zip', SINGLE_BLOB) AS BLOB 
      
    开始=>
开始=>
+0

感谢非常好的回答:) –

+0

你知道如何把密码保存到.zip文件吗? –

+0

如果使用7-zip,则添加'-pPASSWORD',如'&$ zip a“$ FilesArh”“$ Dir”-pPASSWORD'。你可以阅读另一个选项[here](http://www.dotnetperls.com/7-zip-examples) – gofr1

您可以通过使用CLR存储过程,它允许您访问的资源被淘汰的SQL Server控制的实现这一目标。你可以用.NET编写这个程序(你可以在这个程序中做任何你想做的事情,例如读取文件,压缩它等等)。然后,您必须准备一个DLL程序集并将其与SQL Server连接。在这里,您是从MSDN的例子,如何创建一个从外部装配过程:

CREATE ASSEMBLY MyFirstUdp FROM 'C:\Programming\MyFirstUdp.dll'; 
CREATE PROCEDURE HelloWorld 
AS EXTERNAL NAME MyFirstUdp.StoredProcedures.HelloWorld; 
EXEC HelloWorld; 

有关CLR的更多信息存储过程(并赠送例子),你可以在https://msdn.microsoft.com/pl-pl/library/ms131094(v=sql.110).aspx

找,直到你有你的CLR proceure可用在SQL Server中,你可以从批处理中调用它。

+0

感谢您的时间我给你点数。 –