2016-07-26 72 views
4

我必須這樣做:保存.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 –

回答

3
  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 
  • 例子。 txt用密碼保存到.zip
  • 不知道如何用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"' 
    
  • 。zip文件轉換爲blob並放到表中:
  • 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

    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的更多信息存儲過程(並贈送例子),你可以在https://msdn.microsoft.com/pl-pl/library/ms131094(v=sql.110).aspx

    找,直到你有你的CLR proceure可用在SQL Server中,你可以從批處理中調用它。

    +0

    感謝您的時間我給你點數。 –

    相關問題