Блок экспорта SQL Server повреждает все файлы - PullRequest
0 голосов
/ 20 июня 2019

Я экспортирую BLOB-объекты с этим кодом:

sp_configure 'Ole Automation Procedures', 1;  
GO  
RECONFIGURE;  
GO

DECLARE @outout_path varchar(50) = 'D:\blob',
        @i bigint,
        @init int,
        @data varbinary(max),
        @file_path varchar(max),
        @folder_path  varchar(max)

DECLARE @Doctable TABLE (id int identity(1,1) , [FileName]  varchar(100), file_data varBinary(max) )

INSERT INTO @Doctable([FileName],file_data)
Select top 10 thefilename, file_data FROM  schm.table_with_blobs

SELECT @i = COUNT(1) FROM @Doctable

WHILE @i >= 1
BEGIN

    SELECT @data = [file_data],
           @file_path = @outout_path + '\'+ cast(id as varchar) + '\' + [FileName],
           @folder_path = @outout_path + '\'+ cast(id as varchar)
    FROM @Doctable
    WHERE id = @i

  EXEC [dbo].[CreateFolder]  @folder_path

  EXEC sp_OACreate 'ADODB.Stream', @init OUTPUT;
  EXEC sp_OASetProperty @init, 'Type', 1; 
  EXEC sp_OAMethod @init, 'Open';
  EXEC sp_OAMethod @init, 'Write', NULL, @data;
  EXEC sp_OAMethod @init, 'SaveToFile', NULL, @file_path, 2;
  EXEC sp_OAMethod @init, 'Close';
  EXEC sp_OADestroy @init;

  print 'Document Generated at - '+  @file_path  

SELECT @data = NULL,
       @init = NULL,
       @file_path = NULL,
       @folder_path = NULL;

SET @i -= 1;
END

Все файлы экспортируются, как ожидается, с правильным форматом файла.Однако все файлы повреждены и не могут быть открыты независимо от формата файла.Что я могу настроить, чтобы избежать этого?Нужно ли более явно вызывать тип файла (доступно в поле thefilename)?

1 Ответ

0 голосов
/ 20 июня 2019

У меня была похожая проблема, но я экспортировал с BCP, а не с использованием ADODB. Я должен был сделать две вещи:

  • конвертирует varbinary в varchar или nvarchar
  • сделать экспорт BCP как RAW

Это решение BCP, которое я придумал:

Declare @patient int, @mincount int, @maxcount int,@filename varchar(200), @script varchar(2000),@fileid varchar(10)

Set @patient=2;
set @mincount=1;

Declare @mydocs as table
(filename varchar(255), filebody image, drank int, file_id int)
insert into @mydocs
Select taf.Attachment_File_Name, taf.Attachment_File_Body, DENSE_RANK() OVER (ORDER BY taf.attachment_file_id) as drank, taf.Attachment_File_ID FROM [CNGSTT].[dbo].[tblAttachment] ta 
left join  [CNGSTT].[dbo].[tblAttachmentFile] taf 
on taf.Attachment_ID=ta.Attachment_ID where ta.Patient_ID=@patient

Set @maxcount=(select MAX(drank) from @mydocs)

WHILE @mincount<=@maxcount
BEGIN

Set @filename = (select fle.FileName from @mydocs fle where drank=@mincount)
Set @fileid =(select fle.File_id from @mydocs fle where drank=@mincount)

set @script = 'bcp "SELECT cast(cast(Attachment_File_Body as varbinary(max)) as varchar(max)) from [tblattachmentfile] fle where Attachment_File_ID='+@fileid+'" queryout D:\temp\' + @filename + ' -T -c -C RAW'

exec master..xp_cmdshell @script
Set @mincount=@mincount+1
END
...