Я использую хранимую процедуру для создания папок, которые затем заполняются файлами, извлеченными из столбцов 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 с сохранением хранимой процедуры Марка дал тот же результат, что и оригиналы.