2009-09-02 2 views
10

Я использую Microsoft SQL Server Management Studio для подключения к базе данных. В нем у меня есть таблица, один столбец которой представляет собой столбец изображения, содержащий данные файла. Другой столбец - это строка, содержащая имя файла.Как экспортировать поле изображения в файл?

Есть ли способ написать какой-нибудь sql-скрипт, который позволит мне выбрать запись и записать эти данные в файл? Или, если это невозможно, какой простой способ достичь этого?

Я видел этот связанный с этим вопрос, но это, кажется, не совсем то же самое: Save image column to file in sql-server 2000

ответ

25
-- Write all database images (jpg) to file. 
--------- --------- --------- --------- --------- --------- --------- 
DECLARE CURSOR_ProductIds CURSOR FOR (SELECT ImgImagesId FROM ImgProductSample) 

DECLARE @ProductId INT; 

OPEN CURSOR_ProductIds 

FETCH NEXT FROM CURSOR_ProductIds INTO @ProductId 
WHILE (@@FETCH_STATUS <> -1) 
BEGIN 
    DECLARE @ImageData varbinary(max); 
    SELECT @ImageData = (SELECT convert(varbinary(max), ImageData, 1) FROM ProductImages WHERE Id = @ProductId); 

    DECLARE @Path nvarchar(1024); 
    SELECT @Path = 'C:\MyImages\Output'; 

    DECLARE @Filename NVARCHAR(1024); 
    SELECT @Filename = (SELECT ImageFilename FROM ProductImages WHERE id = @ProductId); 

    DECLARE @FullPathToOutputFile NVARCHAR(2048); 
    SELECT @FullPathToOutputFile = @Path + '\' + @Filename; 

    DECLARE @ObjectToken INT 
    EXEC sp_OACreate 'ADODB.Stream', @ObjectToken OUTPUT; 
    EXEC sp_OASetProperty @ObjectToken, 'Type', 1; 
    EXEC sp_OAMethod @ObjectToken, 'Open'; 
    EXEC sp_OAMethod @ObjectToken, 'Write', NULL, @ImageData; 
    EXEC sp_OAMethod @ObjectToken, 'SaveToFile', NULL, @FullPathToOutputFile, 2; 
    EXEC sp_OAMethod @ObjectToken, 'Close'; 
    EXEC sp_OADestroy @ObjectToken; 

    FETCH NEXT FROM CURSOR_ProductIds INTO @ProductId 
END 
CLOSE CURSOR_ProductIds 
DEALLOCATE CURSOR_ProductIds 

-- Make sure the following statement is executed to enable file IO 
-- From http://msdn.microsoft.com/en-us/library/ms191188.aspx 
--------- --------- --------- --------- --------- --------- --------- 
sp_configure 'show advanced options', 1; 
GO 
RECONFIGURE; 
GO 
sp_configure 'Ole Automation Procedures', 1; 
GO 
RECONFIGURE; 
GO 
+0

Msg 8152, уровень 16, состояние 10, строка 7 Строковые или двоичные данные будут усечены. –

2
-- Write database image (jpg) to file 
-- http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=101754 
--------- --------- --------- --------- --------- --------- --------- 
DECLARE @ImageData varbinary(max); 
SELECT @ImageData = (SELECT convert(varbinary(max), ImageData, 1) FROM ProductImages WHERE Id = 1); 

DECLARE @Path nvarchar(1024); 
SELECT @Path = 'C:\MyImages\Output'; 

DECLARE @Filename NVARCHAR(1024); 
SELECT @Filename = (SELECT ImageFilename FROM ProductImages WHERE id = 1); 

DECLARE @FullPathToOutputFile NVARCHAR(2048); 
SELECT @FullPathToOutputFile = @Path + '\' + @Filename; 

DECLARE @ObjectToken INT 
EXEC sp_OACreate 'ADODB.Stream', @ObjectToken OUTPUT; 
EXEC sp_OASetProperty @ObjectToken, 'Type', 1; 
EXEC sp_OAMethod @ObjectToken, 'Open'; 
EXEC sp_OAMethod @ObjectToken, 'Write', NULL, @ImageData; 
EXEC sp_OAMethod @ObjectToken, 'SaveToFile', NULL, @FullPathToOutputFile, 2; 
EXEC sp_OAMethod @ObjectToken, 'Close'; 
EXEC sp_OADestroy @ObjectToken; 

-- Make sure the following statement is executed to enable file IO 
-- From http://msdn.microsoft.com/en-us/library/ms191188.aspx 
--------- --------- --------- --------- --------- --------- --------- 
sp_configure 'show advanced options', 1; 
GO 
RECONFIGURE; 
GO 
sp_configure 'Ole Automation Procedures', 1; 
GO 
RECONFIGURE; 
GO 

PS - ссылка на статью «Чтение и запись файлов в SQL Server с помощью T-SQL» был полезно, но после того, как я получил часть кода, он создал недопустимый файл изображения.

+0

@mathijusuitmegan Я столкнулся этот вопрос: Msg 8152, уровень 16, состояние 10, строка 7 Строка или двоичные данные будут усечены. –

5

От mkader в codeproject:

EXEC sp_configure 'show advanced options', 1; 
GO 
RECONFIGURE; 
GO 
EXEC sp_configure 'xp_cmdshell',1 
GO 
RECONFIGURE; 
GO 

Затем дамп формат файла:

Declare @sql varchar(500) 
SET @sql = 'bcp DBName.dbo.tblTableName format nul -T -n -f C:\testblob.fmt -S ' + @@SERVERNAME 
select @sql 
EXEC master.dbo.xp_CmdShell @sql 

Мой формат файла выглядит следующим образом:

10.0 
12 
1  SQLINT    0  4  "" 1  my_tablecol_id         "" 
2  SQLINT    1  4  "" 2  my_tablecol0         "" 
3  SQLCHAR    2  256  "" 3  my_tablecol1        SQL_Latin1_General_CP1_CI_AS 
4  SQLCHAR    2  256  "" 4  my_tablecol2        SQL_Latin1_General_CP1_CI_AS 
5  SQLCHAR    2  256  "" 5  my_tablecol3       SQL_Latin1_General_CP1_CI_AS 
6  SQLCHAR    2  2048 "" 6  my_tablecol4        SQL_Latin1_General_CP1_CI_AS 
7  SQLIMAGE   4  0  "" 7  my_imagecol          "" 
8  SQLCHAR    2  2048 "" 8  my_tablecol6       SQL_Latin1_General_CP1_CI_AS 
9  SQLINT    1  4  "" 9  my_tablecol7          "" 
10  SQLINT    1  4  "" 10 my_tablecol8         "" 
11  SQLINT    1  4  "" 11 my_tablecol9        "" 
12  SQLBIT    1  1  "" 12 my_tablecol10        "" 

я тогда редактировал формат файла:

10.0 
1 
1  SQLIMAGE   0  0  "" 1  my_imagecol          "" 

А потом запустили этот SQL в SSMS:

Declare @mynum int 
Declare @sql varchar(500) 
SET @mynum = 49 -- something meaningful only to me 
SET @sql = 'BCP "SELECT my_imagecol FROM DBName.dbo.tblTableName where [email protected]" QUERYOUT C:\myfilename.docx -T -fC:\testblob.fmt -S ' + @@SERVERNAME 
EXEC master.dbo.xp_CmdShell @sql 

Это работало очень хорошо, любой вид данных в столбце изображения работает.

+0

Спасибо! Файл формата был тем, что мне нужно, чтобы это работало. –

0

Я знаю, что это выше 2-летней темы, все еще хотелось опубликовать сообщение, потому что это могло помочь кому-то. Если мы хотим экспортировать изображения вместе с другими столбцами (включая символы) из таблицы базы данных в файл, чтобы их можно было импортировать в другой SQL Server, это очень удобно.

Приведенный ниже код экспортирует указанную таблицу базы данных в путь к файлу выбора.

Declare @sql varchar(500) 
SET @sql = 'bcp Your_db.Your_table out Your_File_Path(eg: C:\ImagesNames.Dat) -w -T -S ' + @@SERVERNAME 
EXEC @sql 

Опция -w для файла данных в формате Unicode и разделитель будет вкладка по умолчанию разделитель в случае мы не указываем разделитель. В этом случае файл данных сохраняется с расширением dat. Может быть, он может быть сохранен и в других форматах, но я его не тестировал, тогда как это работает отлично.

https://msdn.microsoft.com/en-gb/library/ms188289(v=sql.110).aspx

Тогда для импорта:

BULK INSERT Your_db.Your_table 
    FROM 'Your_File_Path' 
with (DATAFILETYPE='widechar') 

Это импортирует файл данных очень эффективно в указанной таблице базы данных.

-2

адаптированный решение по mathijsuitmegen и это работало отлично для меня:

Code1

Code2

+0

Я предлагаю вам скопировать текст вместо изображения. Иначе читать это не очень приятно. – Carol

Смежные вопросы