【问题标题】:SQL Server Msg 50000 when using stored procedure to create folder使用存储过程创建文件夹时 SQL Server Msg 50000
【发布时间】:2019-05-14 17:19:21
【问题描述】:

我使用存储过程来创建文件夹,然后填充从varBinary 列中提取的文件。该过程适用于许多行,但我从其他人那里收到以下错误:

消息 50000,级别 16,状态 1,过程 dbo.CreateFolder,第 31 行 [批处理开始行 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 提取文件使用 this guide

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 但保留 Marc 的存储过程与原始结果相同。

【问题讨论】:

  • 您是否检查了您尝试创建的文件夹名称或文件名以查找失败并显示错误消息的行?
  • 据我所知,即使出现错误,也会创建文件夹和文件。创建的文件没有表中的行多,但这似乎是由于其他因素,例如空 [File_Object]。也许这些错误只是一个红鲱鱼。

标签: sql-server tsql ole


【解决方案1】:

在从数据库提取到文件系统的过程中,您似乎试图在一个不存在的文件夹中创建一个文件夹。

只能在现有文件夹内创建具有此过程的文件夹。

例如:

EXEC [dbo].[CreateFolder] 'C:\DocsFromDB\2019'

如果DocsFromDB 不存在,则无法创建文件夹2019。您应该首先创建DocsFromDB 以便能够在其中创建其他文件夹。

【讨论】:

    猜你喜欢
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 2013-05-02
    • 2012-05-25
    • 1970-01-01
    相关资源
    最近更新 更多