2012-05-04 5 views
16

У меня есть несколько столбцов с типом данных image, и я хочу просмотреть (или просмотреть) данные в этих таблицах. Когда я использую Select top 1000 rows в SQL Server Management Studio, значение столбцов изображения отображается шестнадцатеричным. Какой самый простой способ просмотреть эти изображения, поскольку значение hex не полезно для меня?Каков самый простой способ предварительного просмотра данных из столбца изображения?

PS .: база данных не под моим контролем, поэтому изменение типа данных не является вариантом.

ответ

14

Я хотел бы написать 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 
+0

Умный и хорошо продуманный ответ +1 – EBarr

+0

Спасибо за запрос. Для тестирования я создал файл .fmt с информацией о каждом столбце моей таблицы, затем я пытаюсь выполнить BCP SELECT MyImageField FROM (...) queryout (...) 'на одной записи, передавая сгенерированный файл '.fmt', но он вызывает эту ошибку:« Столб-хосты могут быть пропущены только при копировании на сервер ». Ты знаешь почему? –

+0

Это сообщение msdn рекомендует вам попробовать установить fmtonly off перед запуском. Проверьте здесь ту же ошибку и исправьте. http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/7ba623ee-8b48-44ce-ab1b-c6bf5af5a2e3/ – RThomas

4

Я не знаю, как это можно сделать в Management Studio. Вероятно, вам лучше написать письмо с простым приложением, которое может запросить базу данных, а затем преобразовать шестнадцатеричный код в правильный тип изображения (.jpg, .png и т. Д.). Есть также commercial приложения, которые сделают это за вас.

+0

Upvoting, поскольку это правильный ответ, но я до сих пор ищу решение, которое не включает в себя написание или покупке приложений , –

9

Тип image не предназначен для хранения изображений, это всего лишь двоичные данные переменной длины. Этот тип устарел, и теперь вы должны использовать varbinary (max) для двоичных данных переменной длины.

Поскольку SQL Server не знает, какой тип двоичных данных был сохранен (.zip, .exe, .jpg, .anything), это не удивительно, что Management Studio не предоставляет предварительный просмотр.

Вы определенно не можете просмотреть эти типы данных в Managment Studio, но мне нравится решение, данное @RTomas.

+0

Возможно, это было поспешно - но я видел ваше сообщение как комментарий, а не ответ. Существует ВСЕГДА способ сделать что-то. Ничто в ваших комментариях о типе данных или препятствиях к проблеме не является технически неверным, но ваш единственный ответ был ВЫ НЕ СМОЖЕТЕ ЭТО. Я думаю, вы МОЖЕТЕ, как здесь указывают два других ответа. Если вы все еще считаете несправедливым - я верну его. Я не имел в виду обиду. – RThomas

+0

О, забыл другую причину. Первоначальный вопрос заявил, что он не контролирует тип данных. – RThomas

+0

@Phil, в то время как вы, возможно, не оптимистичный оптимист RTHomas, вы хорошо разбираетесь в типе данных (хотя это не то, о чем спрашивал OP). Кроме того, возможно, вопрос ОФ гласит: «Как это можно сделать в SSMS», что позволяет правильно ответить на ваш вопрос. +1. – EBarr

23

Если у вас есть LinqPad установлен, предварительный просмотр изображений прост. Запросите свою запись, преобразуйте двоичные данные в изображение, а затем выгрузите вывод в окно предварительного просмотра.

Редактировать: Если вы не знаете, LinqPad - это бесплатная утилита, которая может использоваться для многих вещей, таких как замена студий управления. Большую часть времени я использую его как блокнот для .Net для отбрасываемых программ, тестового кода и образцов.

var entity = // fetch data 

using (var ms = new MemoryStream(entity.Image.ToArray())) 
{ 
    System.Drawing.Image.FromStream(ms).Dump(); 
} 

Вот что результат выглядит следующим образом:

enter image description here

+0

Эта программа потрясающая! Просто выгрузили мои 20000 снимков из базы данных с помощью 'System.Drawing.Image.FromStream (ms) .Save (...)'. Может также сохранить поток напрямую. – SoonDead

+0

бесценный образ. SO стал настолько большим количеством переполнения мусора – JJS

+3

var entity = // fetch data .... Как получать данные с сервера sql с помощью кода ur? не могли бы вы дать мне некоторые подробности? –

0

Существует очень большая надстройка для SSMS SSMSBoost, которая, которая предоставляет множество полезных функций, и, конечно же, самый простой способ для предварительного просмотра изображения, хранящиеся в SQL (по крайней мере, на мой взгляд)

ПРИМЕЧАНИЕ: После установки этой надстройки необходимо перезапустить SSMS.

Установите его и наслаждаться предварительным просмотром изображений только с: RightClick> Визуализировать As> Picture

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