【发布时间】: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