Я хотел бы написать proc (или запрос, см. Ниже), чтобы экспортировать двоичный файл в файловую систему, а затем использовать любую старую утилиту управления фотографиями на полке (т.е. Windows Photo Viewer), чтобы посмотреть, что внутри.
Если ваш умник в названии файла, вы можете предоставить себе достаточно информации о каждом изображении в названии, чтобы быстро найти его в базе данных снова, как только вы наглядно найдете то, что ищете.
Ниже приведен фрагмент proc, который будет экспортировать двоичный файл в файловую систему. Я изменил с this sample code. Он непроверен, но должен быть очень близок к концепции. Он использует BCP для экспорта вашего двоичного кода. Проверьте здесь full docs on the BCP utility.
Прок также дает вам возможность экспортировать все в таблицу или только одну строку на основе переданного ключа. Он использует курсор (yuck), а также некоторый динамический sql (yuck, yuck), но иногда вы должны делать то, что должны делать.
CREATE PROCEDURE ExportMyImageFiles
(
@PriKey INT,
@OutputFilePath VARCHAR(500)
)
AS
BEGIN
DECLARE @sql VARCHAR(8000)
IF @PriKey IS NULL /* export all images */
BEGIN
DECLARE curExportBinaryImgs CURSOR FAST_FORWARD FOR
SELECT 'BCP "SELECT MyImage FROM [dbo].[MyTable]
WHERE PrimaryKey =' + CAST(PrimaryKey AS VARCHAR(25)) +
'" queryout ' + @OutputFilePath + MyImageName + '.' +
MyImageType + ' -S MyServer\MyInstance -T -fC:\Documents.fmt'
FROM [dbo].[MyTable]
OPEN curExportBinaryImgs
FETCH NEXT FROM curExportBinaryImgs INTO @sql
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC xp_cmdshell @sql, NO_OUTPUT
FETCH NEXT FROM curExportBinaryImgs INTO @sql
END
CLOSE curExportBinaryImgs
DEALLOCATE curExportBinaryImgs
END
ELSE /* Export only the primary key provided */
BEGIN
SELECT @sql = 'BCP "SELECT MyImage FROM [dbo].[MyTable]
WHERE PrimaryKey =' + CAST(PrimaryKey AS VARCHAR(25)) +
'" queryout ' + @OutputFilePath
+ MyImageName + '.' + MyImageType +
' -S MyServer\MyInstance -T -fC:\Documents.fmt'
FROM [dbo].[MyTable]
WHERE PrimaryKey = @PriKey
EXEC xp_cmdshell @sql,NO_OUTPUT
END
END
Все это предполагает, конечно, что то, что хранится в столбце «Изображение», на самом деле является изображением, а не другим типом файла. Надеюсь, если это изображение, которое вы также знаете тип, BMP, JPG, PNG, GIF и т.д.
Если вы не хотите стычки или повторное использование полномасштабного прока попробовать один запрос, как это:
DECLARE @OutputFilePath VarChar(500) = /* put output dir here */
DECLARE @sql VARCHAR(8000)
DECLARE curExportBinaryImgs CURSOR FAST_FORWARD FOR
SELECT 'BCP "SELECT MyImage FROM [dbo].[MyTable]
WHERE PrimaryKey =' + CAST(PrimaryKey AS VARCHAR(25)) +
'" queryout ' + @OutputFilePath + MyImageName + '.' +
MyImageType + ' -S MyServer\MyInstance -T -fC:\Documents.fmt'
FROM [dbo].[MyTable]
OPEN curExportBinaryImgs
FETCH NEXT FROM curExportBinaryImgs INTO @sql
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC xp_cmdshell @sql, NO_OUTPUT
FETCH NEXT FROM curExportBinaryImgs INTO @sql
END
CLOSE curExportBinaryImgs
DEALLOCATE curExportBinaryImgs
Умный и хорошо продуманный ответ +1 – EBarr
Спасибо за запрос. Для тестирования я создал файл .fmt с информацией о каждом столбце моей таблицы, затем я пытаюсь выполнить BCP SELECT MyImageField FROM (...) queryout (...) 'на одной записи, передавая сгенерированный файл '.fmt', но он вызывает эту ошибку:« Столб-хосты могут быть пропущены только при копировании на сервер ». Ты знаешь почему? –
Это сообщение msdn рекомендует вам попробовать установить fmtonly off перед запуском. Проверьте здесь ту же ошибку и исправьте. http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/7ba623ee-8b48-44ce-ab1b-c6bf5af5a2e3/ – RThomas