SQL Server Msg 50000 при использовании хранимой процедуры для создания папки - PullRequest
0 голосов
/ 14 мая 2019

Я использую хранимую процедуру для создания папок, которые затем заполняются файлами, извлеченными из столбцов varBinary.Процесс работает для многих строк, но я получаю следующую ошибку от других:

Msg 50000, Уровень 16, Состояние 1, Процедура dbo.CreateFolder, Строка 31 [Batch Start Line 0]

Я не уверен, что это значит или почему это может произойти в некоторых строках, а не в других.

Моя хранимая процедура:

ALTER 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 doesn't 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  

ТогдаЯ использую T-SQL для извлечения файлов, используя это руководство

USE MYDB
DECLARE @outPutPath varchar(50) = 'C:\MYDB\Export\Blob'
, @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 @Doctable TABLE 
                  (
                      id INT IDENTITY(1, 1), 
                      [Attachment_ID] VARCHAR(100),  
                      [File_Name] VARCHAR(100), 
                      [Call_Number] VARCHAR(100), 
                      [File_Object] VARBINARY(MAX) 
                  )

INSERT INTO @Doctable([Attachment_ID], [File_Name], [Call_Number], [File_Object])
    SELECT
        [Attachment_ID], [File_Name], [Call_Number], [File_Object] 
    FROM  
        [dbo].[Attachment] 
    WHERE 
        Call_Number = '32893'

    --SELECT * FROM @table

SELECT @i = COUNT(1) FROM @Doctable

WHILE @i >= 1
BEGIN 

    SELECT 
        @data = [File_Object],
        @fPath = @outPutPath + '\'+ [Call_Number] + '\' +[File_Name],
        @folderPath = @outPutPath + '\'+ [Call_Number]
    FROM 
        @Doctable 
    WHERE 
        id = @i

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

    EXEC sp_OACreate 'ADODB.Stream', @init OUTPUT; -- An instance 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

У кого-нибудь есть идеи относительно того, что идет не так?

Я пытался использовать отредактированные версиихранимая процедура и T-SQL (от Marc), но ошибка отображается в каждой строке, и файлы не генерируются.Возврат T-SQL с сохранением хранимой процедуры Марка дал тот же результат, что и оригиналы.

...