从 SQL Server 导出 Blob 并将其保存为文件

Posted

技术标签:

【中文标题】从 SQL Server 导出 Blob 并将其保存为文件【英文标题】:Export Blob From SQL Server and save it as a file 【发布时间】:2019-04-09 06:46:58 【问题描述】:

我正在尝试将数据从 SQL Server 导出到文件。数据是 docs、pdf、jpegs、xls 和 sms。我找到了一个可以这样做的脚本,但是每当我运行它时,我都会收到一条非描述性错误消息

C:\ExtractBlob\folder1\folder2\folder3 消息 50000,级别 16,状态 1,过程 CreateFolder,第 30 行 [批处理开始第 8 行]

我的代码如下:

创建用于存储 Blob 的文件夹的过程

            sp_configure 'show advanced options', 1;
            GO
            RECONFIGURE;
            GO
            sp_configure 'Ole Automation Procedures', 1;
            GO
            RECONFIGURE;
            GO

            CREATE PROCEDURE [dbo].[CreateFolder] (@newfolder varchar(1000)) AS 
            BEGIN 
            DECLARE @OLEfolder   INT 
            DECLARE @OLEsource   VARCHAR(255) 
            DECLARE @OLEdescription  VARCHAR(255)
            DECLARE @init   INT 
            DECLARE @OLEfilesytemobject INT

            -- it will fail if OLE automation not enabled
            EXEC @init=sp_OACreate 'Scripting.FileSystemObject', @OLEfilesytemobject OUT 
            IF @init <> 0 
            BEGIN 
                EXEC sp_OAGetErrorInfo @OLEfilesytemobject 
                RETURN 
            END 
            -- check if folder exists
            EXEC @init=sp_OAMethod @OLEfilesytemobject, 'FolderExists', @OLEfolder OUT, @newfolder
            -- if folder doesnt exist, create it 
                IF @OLEfolder=0 
                BEGIN 
                EXEC @init=sp_OAMethod @OLEfilesytemobject, 'CreateFolder', @OLEfolder OUT, @newfolder 
            END 
            -- in case of error, raise it  
            IF @init <> 0 
                BEGIN 
                    EXEC sp_OAGetErrorInfo @OLEfilesytemobject, @OLEsource OUT, @OLEdescription OUT 
                    SELECT @OLEdescription='Could not create folder: ' + @OLEdescription 
                    RAISERROR (@OLEdescription, 16, 1)  
                END 
            EXECUTE @init = sp_OADestroy @OLEfilesytemobject 
            END 

导出代码

            USE [IQS]
            DECLARE @outPutPath varchar(50) = 'C:\Users\trenton.gibbs\Documents\Extract'
            , @i bigint
            , @init int
            , @data varbinary(max)
            , @fPath varchar(max) 
            , @folderPath  varchar(max)

            --Get Data into temp Table variable so that we can iterate over it
            DECLARE @Imagetable TABLE (id int identity(1,1), [Doc_Num]  varchar(100) , [FileName]  varchar(100), [Doc_Content] varBinary(max) )

            INSERT INTO @Imagetable([Doc_Num],[FileName],[Doc_Content])
            Select [Link_Embed_Sysid],[File_Location], Convert(varbinary(max),[Embed_Object]) FROM  [dbo].[Link_Embed]
            Where Create_Date Between '9/1/2018' And '9/8/2018'
            And [Embed_Object] IS NOT NULL

            --SELECT * FROM @Imagetable

            SELECT @i = COUNT(1) FROM @Imagetable

            WHILE @i >= 1
            BEGIN

                SELECT
                 @data = [Doc_Content],
                 @fPath = @outPutPath + '\'+ [Doc_Num] + '\' +[FileName],
                 @folderPath = @outPutPath + '\'+ [Doc_Num]
                FROM @Imagetable WHERE id = @i

              --Create folder first
              EXEC  [dbo].[CreateFolder]  @folderPath

              EXEC sp_OACreate 'ADODB.Stream', @init OUTPUT; -- An instace created
              EXEC sp_OASetProperty @init, 'Type', 1; 
              EXEC sp_OAMethod @init, 'Open'; -- Calling a method
              EXEC sp_OAMethod @init, 'Write', NULL, @data; -- Calling a method
              EXEC sp_OAMethod @init, 'SaveToFile', NULL, @fPath, 2; -- Calling a method
              EXEC sp_OAMethod @init, 'Close'; -- Calling a method
              EXEC sp_OADestroy @init; -- Closed the resources

              print 'Document Generated at - '+  @fPath  

            --Reset the variables for next use
            SELECT @data = NULL 
            , @init = NULL
            , @fPath = NULL 
            , @folderPath = NULL
            SET @i -= 1
            END

有谁知道是什么导致了这个错误?

【问题讨论】:

有一些方法可以做到这一点(阅读与格式文件相关的 BCP 以避免标题,这会使您的文件无效),但是 - 如果这对您来说是可能的 - 您应该使用另一个工具。使用 C#、Java 或任何其他编程语言从数据库中读取数据并将其写入具有您需要的任何编码的文件要容易得多.... 我认为你必须加倍\尝试:DECLARE @outPutPath varchar(50) = 'C:\\Users\\trenton.gibbs\\Documents\\Extract' 没有理由使用 OLE,也绝对不是那些旧的不安全的存储过程。使用 SQL Server 的内置工具 - bcp、sqlcmd、SSIS。事实上,您必须削弱安全性 以允许使用这些存储过程。没有 DBA 会允许这样做,也没有必要 就个人而言,我会使用 Power Shell 为任何“一次性”项目提取 Blob 文件文件。如果这将是一个持续的项目/过程,那么我会考虑构建一个 SSIS 包或一个小型 C# 应用程序。 How do I use BCP or Sql Server Management Studio to get BLOB data out of Sql Server?的可能重复 【参考方案1】:

您可能需要检查您的文件夹创建路径。

@outPutPath varchar(50) = 'C:\Users\trenton.gibbs\Documents\Extract'

可能是权限相关或路径无效。例如,要创建文件夹“Extract”,[C:\Users\trenton.gibbs\Documents\] 必须已经存在。

【讨论】:

以上是关于从 SQL Server 导出 Blob 并将其保存为文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 BCP 或 Sql Server Management Studio 从 Sql Server 中获取 BLOB 数据?

markdown 从SQL数据库导出多个blob /图像

如何将 Excel 数据从不同的工作表导出到 SQL-SERVER 数据库?

导出 blob 需要哪些权限

将数据从平面文件加载到 Sql Server 表,并使用 SSIS 导出到 excel

如何使用 Dapper 从 SQL Server Image 字段中读取 blob 数据?