Экспортировать BLOB-объект из SQL Server и сохранить его в виде файла

Я пытаюсь экспортировать данные из SQL Server в файл. Данные в формате docs, pdf, jpeg, xls и sms. Я нашел сценарий, который будет делать это, однако всякий раз, когда я его запускаю, я получаю неописательное сообщение об ошибке.

C:\ExtractBlob\folder1\folder2\folder3 Msg 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

Кто-нибудь знает, что может быть причиной этой ошибки?


person NightCode312    schedule 05.11.2018    source источник
comment
Есть способы сделать это (читайте о BCP в связи с файлом форматирования, чтобы избежать заголовка, который сделал бы ваш файл недействительным), но - если это возможно для вас - вам лучше использовать для этого другой инструмент. Гораздо проще читать данные из вашей базы данных и записывать их в файл с любой кодировкой, которая вам нужна, с C #, Java или любым другим языком программирования....   -  person Shnugo    schedule 06.11.2018
comment
Я думаю, вам нужно удвоить \ Попробуйте: DECLARE @outPutPath varchar(50) = 'C:\\Users\\trenton.gibbs\\Documents\\Extract'   -  person DanB    schedule 06.11.2018
comment
Нет причин использовать OLE и определенно не те старые небезопасные хранимые процедуры. Используйте встроенные инструменты SQL Server — bcp, sqlcmd, SSIS. На самом деле вам придется ослабить безопасность, чтобы разрешить использование этих хранимых процедур. Ни один администратор баз данных не допустит этого, да и не нужно.   -  person Panagiotis Kanavos    schedule 06.11.2018
comment
Лично я бы использовал Power Shell для извлечения файлов Blob Files для любого отдельного проекта. Если бы это был непрерывный проект/процесс, я бы посмотрел на создание пакета SSIS или небольшого приложения C#.   -  person Mark Kram    schedule 06.11.2018
comment
Возможный дубликат Как мне использовать BCP или Sql Server Management Studio для получения данных BLOB из Sql Server?   -  person Panagiotis Kanavos    schedule 06.11.2018


Ответы (1)


Возможно, вы захотите проверить путь создания папки.

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

Это может быть связано либо с разрешениями, либо с недопустимым путем. Например, чтобы создать папку «Извлечение», [C:\Users\trenton.gibbs\Documents\] уже должен существовать.

person level3looper    schedule 06.11.2018