Как выгрузить все наши изображения из поля VARBINARY (MAX) в SQL Server 2008 в файловую систему?
-
03-07-2019 - |
Вопрос
У меня есть таблица, в которой есть IDENTITY
поле и VARBINARY(MAX)
поле в нем.Есть ли какой-нибудь способ, которым я мог бы удалить содержимое каждого VARBINARY(MAX)
поле для файловая система (например. c:\temp\images
)?
Схема таблицы:
PhotoId INTEGER NOT NULL IDENTITY
Image VARBINARY(MAX) NOT NULL
DateCreated SMALLDATETIME
Выходной сигнал:
c:\temp\images\1.png
c:\temp\images\2.png
c:\temp\images\3.png
... etc...
Как лучше всего подойти к этому?
Решение
Я понял это благодаря этот пост ...
SET NOCOUNT ON
DECLARE @IdThumbnail INTEGER,
@MimeType VARCHAR(100),
@FileName VARCHAR(200),
@Sqlstmt varchar(4000)
DECLARE Cursor_Image CURSOR FOR
SELECT a.IdThumbnail
FROM tblThumbnail a
ORDER BY a.IdThumbnail
OPEN Cursor_Image
FETCH NEXT FROM Cursor_Image INTO @IdThumbnail
WHILE @@FETCH_STATUS = 0
BEGIN
-- Generate the file name based upon the ID and the MIMETYPE.
SELECT @FileName = LTRIM(STR(@IdThumbnail)) + '.png'
-- Framing DynamicSQL for XP_CMDshell
SET @Sqlstmt='BCP "SELECT OriginalImage
FROM Appian.dbo.tblThumbnail
WHERE IdThumbnail = ' + LTRIM(STR(@IdThumbnail)) +
'" QUERYOUT c:\Temp\Images\' + LTRIM(@FileName) +
' -T -fC:\Temp\ImageFormatFile.txt'
print @FileName
print @sqlstmt
EXEC xp_cmdshell @sqlstmt
FETCH NEXT FROM Cursor_Image INTO @IdThumbnail
END
CLOSE Cursor_Image
DEALLOCATE Cursor_Image
Пожалуйста, обратите внимание -> у вас должен быть файл формата для команды BCP.Это содержимое файла, и я поместил его в c: emp (как указано в командной строке BCP выше).
10.0
1
1 SQLIMAGE 0 0 "" 1 OriginalImage ""
Последнее замечание об этом файле формата ..ПОСЛЕ ПОСЛЕДНЕЙ СТРОКИ ДОЛЖНА БЫТЬ НОВАЯ СТРОКА.в противном случае вы получите сообщение об ошибке.
Наслаждайтесь!
Другие советы
Самым простым (для меня) было бы написать небольшое приложение .NET, которое выгружало бы поля varbinary в файл.
Если вы против работы в .NET, вы должны (я не проверял это) иметь возможность создать новый столбец типа " VARBINARY (MAX) FILESTREAM " ;. Убедитесь, что у вас также есть соответствующий "ROWGUIDCOL" колонка. Тогда вы можете (теоретически) сделать что-то вроде:
ОБНОВЛЕНИЕ таблицы SET varfilestream_col = varbinary_col
Надеюсь, что это работает для вас.