将.zip文件保存到SQL Server中的BLOB

时间:2016-07-26 08:49:39

标签: sql-server tsql

我必须这样做:

  1. 将此@HTML保存到文件example.txt
  2. example.txt使用密码
  3. 保存到.zip
  4. .zip文件转换为blob并存储到表中
  5. 你知道如何只在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
    

    好的我创建了这个:

    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

2 个答案:

答案 0 :(得分:3)

  1. 将此@HTML保存到文件example.txt
  2. 对于此部分,您可以使用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. example.txt使用密码保存到.zip
    2. 不知道如何使用t-sql完成此操作,为此我们使用powershell(或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. 使用OPENROWSET,您可以获取BLOB数据并将其插入表中。

        INSERT INTO your_table (BLOB_field)
        SELECT * 
        FROM OPENROWSET(BULK 'c:\Folder\example.zip', SINGLE_BLOB) AS BLOB
        

答案 1 :(得分:2)

您可以使用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存储过程(以及演示示例)的更多信息,您可以在enter image description here上找到

在SQL Server中提供CLR程序之前,您只能从批处理中调用它。