Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как с помощью sql массово выгрузить blob файлы из таблицы на жёсткий диск ("С:\fies")?  [new]
foxtv
Member

Откуда:
Сообщений: 108
Есть таблица с полями id (тип:integer), file (тип:image) нужно выгрузить все файлы из этой таблицы на диск C в папку files (на стороне сервера, там же где находится СУБД SQL Server 2000). Все файлы имеют расширение .pdf. Именем файла должно выступать поле - id. Например: "23.pdf","27.pdf" и т.д.
20 авг 11, 11:18    [11150451]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью sql массово выгрузить blob файлы из таблицы на жёсткий диск ("С:\fies")?  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
для этого лучше использовать небольшое самописное приложение, например на C#
20 авг 11, 13:30    [11150825]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью sql массово выгрузить blob файлы из таблицы на жёсткий диск ("С:\fies")?  [new]
Super_DJ
Member

Откуда: Königsberg in Preußen
Сообщений: 79
foxtv,

DECLARE @BufLen [int]
DECLARE @BufPos [int]
DECLARE @Buffer [varbinary](4096)
DECLARE @Stream [int]
DECLARE @HR [int]
DECLARE @SomeID [int]
DECLARE @Filename [varchar](max)
DECLARE @Folder [varchar](max)


DECLARE cursor1 CURSOR FOR 
SELECT Id from Table order by Id;

Open cursor1;

FETCH NEXT FROM cursor1
into @SomeID;


WHILE @@FETCH_STATUS = 0
BEGIN

set @Filename=@Folder+@SomeID+'.pdf'

SELECT @BufPos = 1, @BufLen = DATALENGTH(File) FROM Table WHERE ID=@SomeID

EXEC @HR = sp_OACreate 'ADODB.Stream',@Stream OUT 
EXEC @HR = sp_OASetProperty @Stream,'Type',1
EXEC @HR = sp_OAMethod @Stream,'Open' 

WHILE @BufLen > 0 
BEGIN
    SELECT @Buffer = SUBSTRING(File,@BufPos,4096) FROM Table WHERE Id=@SomeID
    EXEC @HR = sp_OAMethod @Stream,'Write',null,@Buffer
    SELECT @BufLen = @BufLen - 4096, @BufPos = @BufPos + 4096
END

EXEC @HR = sp_OAMethod @Stream, 'SaveToFile',Null,@Filename,2
EXEC @HR = sp_OAMethod @Stream, 'Close'
EXEC @HR = sp_OADestroy @Stream

FETCH NEXT FROM cursor1
into @SomeID;
END
CLOSE cursor1;
DEALLOCATE cursor1;
Я делал как-то так. Решение может и не лучшее но работает(проверял на 2005 и старше)
Может ругатся на разрешения, но это в BOL.
20 авг 11, 13:34    [11150826]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью sql массово выгрузить blob файлы из таблицы на жёсткий диск ("С:\fies")?  [new]
iljy
Member

Откуда:
Сообщений: 8711
foxtv,

при возможности использовать bcp можно как-то так:
declare @dir nvarchar(512) = N'E:\1\'

declare @sql nvarchar(max)

set @sql = (
select N'exec xp_cmdshell ''bcp "select Data from TestDB.dbo.Files where id =' +
		CAST(id as nvarchar) + N'" queryout ' + @dir + CAST(id as nvarchar) +
		'.jpg -T -fE:\Queries\ImageToFile\PP.fmt''' + CHAR(10) + CHAR(13)
from TestDB.dbo.Files
where Data is not null
for xml path(''),type).value('.','nvarchar(max)')

--print @sql
exec(@sql)
Файл форматирования такой:
10.0
1
1 SQLBINARY 0 0 "" 1 Data ""
20 авг 11, 14:13    [11150891]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью sql массово выгрузить blob файлы из таблицы на жёсткий диск ("С:\fies")?  [new]
foxtv
Member

Откуда:
Сообщений: 108
Knyazev Alexey
для этого лучше использовать небольшое самописное приложение, например на C#

Искал решение, но так и не нашёл. Пример с javascriptom не подошёл. Если есть статейка киньте пожалуйста ссылку.
21 авг 11, 20:30    [11153704]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью sql массово выгрузить blob файлы из таблицы на жёсткий диск ("С:\fies")?  [new]
Glory
Member

Откуда:
Сообщений: 104760
В DTS SQL2000 есть замечательная Transformation Task с типом
Write File Transformation
The Write File transformation copies the contents of a source column (data column) to a file whose path is specified by a second source column (file name column).

When you configure the transformation, you define the path containing the files listed in the file name column. All the files must be in the same directory path. If the file is not found in the path, one is created and initialized with the contents of the data column.

В SSIS тоже наверное есть аналог
22 авг 11, 12:04    [11155914]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Как с помощью sql массово выгрузить blob файлы из таблицы на жёсткий диск ("С:\fies")?  [new]
vah
Member

Откуда:
Сообщений: 2662
Super_DJ
foxtv,

DECLARE @BufLen [int]
DECLARE @BufPos [int]
DECLARE @Buffer [varbinary](4096)
DECLARE @Stream [int]
DECLARE @HR [int]
DECLARE @SomeID [int]
DECLARE @Filename [varchar](max)
DECLARE @Folder [varchar](max)


DECLARE cursor1 CURSOR FOR 
SELECT Id from Table order by Id;

Open cursor1;

FETCH NEXT FROM cursor1
into @SomeID;


WHILE @@FETCH_STATUS = 0
BEGIN

set @Filename=@Folder+@SomeID+'.pdf'

SELECT @BufPos = 1, @BufLen = DATALENGTH(File) FROM Table WHERE ID=@SomeID

EXEC @HR = sp_OACreate 'ADODB.Stream',@Stream OUT 
EXEC @HR = sp_OASetProperty @Stream,'Type',1
EXEC @HR = sp_OAMethod @Stream,'Open' 

WHILE @BufLen > 0 
BEGIN
    SELECT @Buffer = SUBSTRING(File,@BufPos,4096) FROM Table WHERE Id=@SomeID
    EXEC @HR = sp_OAMethod @Stream,'Write',null,@Buffer
    SELECT @BufLen = @BufLen - 4096, @BufPos = @BufPos + 4096
END

EXEC @HR = sp_OAMethod @Stream, 'SaveToFile',Null,@Filename,2
EXEC @HR = sp_OAMethod @Stream, 'Close'
EXEC @HR = sp_OADestroy @Stream

FETCH NEXT FROM cursor1
into @SomeID;
END
CLOSE cursor1;
DEALLOCATE cursor1;
Я делал как-то так. Решение может и не лучшее но работает(проверял на 2005 и старше)
Может ругатся на разрешения, но это в BOL.


Спасибо, очень помогло.

А как теперь приаттачить этот файл к письму, минуя запись в каталог?

В таком контесте:
автор
EXEC msdb.dbo.sp_send_dbmail @profile_name = 'test', @recipients = 'nццц@ууу.ru;', @subject = 'Добавление файла', @body=@body_text,@query ='select ' + @Stream ,@attach_query_result_as_file=1;
3 сен 12, 10:52    [13103736]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью sql массово выгрузить blob файлы из таблицы на жёсткий диск ("С:\fies")?  [new]
Glory
Member

Откуда:
Сообщений: 104760
vah
А как теперь приаттачить этот файл к письму, минуя запись в каталог?

файл - это уже нечто, расположенное на диске в каком то каталоге

vah
В таком контесте:
автор
EXEC msdb.dbo.sp_send_dbmail @profile_name = 'test', @recipients = 'nццц@ууу.ru;', @subject = 'Добавление файла', @body=@body_text,@query ='select ' + @Stream ,@attach_query_result_as_file=1;

Как всегда читать хелп по процедуре sp_send_dbmail
Про пааметер, задающий имена файлов
3 сен 12, 17:56    [13107829]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью sql массово выгрузить blob файлы из таблицы на жёсткий диск ("С:\fies")?  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 599
Можно через ssis
Но для этого его необходимо поставить или иметь уже

http://www.mssqltips.com/sqlservertip/2693/export-images-from-a-sql-server-table-to-a-folder-with-ssis/
3 сен 12, 18:18    [13107997]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить