2012-05-04 17 views
16

Mam niektóre kolumny z typem danych image i chcę wyświetlić podgląd (lub przeglądać) danych w tych tabelach. Kiedy używam Select top 1000 rows w SQL Server Management Studio, wartość kolumn obrazu jest wyświetlana w systemie szesnastkowym. Jaki jest najłatwiejszy sposób wyświetlania podglądu tych obrazów, ponieważ wartość szesnastkowa nie jest dla mnie przydatna?Jaki jest najłatwiejszy sposób podglądu danych z kolumny graficznej?

PS .: baza danych nie jest pod moją kontrolą, więc zmiana typu danych nie jest opcją.

Odpowiedz

14

Napisałbym proc (lub zapytanie, patrz poniżej), aby wyeksportować plik binarny do systemu plików, a następnie użyć dowolnego starego narzędzia do zarządzania zdjęciami dostępnego pod numerem (np. Windows Photo Viewer), aby zobaczyć, co jest wewnątrz.

Jeśli jesteś sprytnym użytkownikiem w swoim nazewnictwie plików, możesz podać sobie wystarczającą ilość informacji o każdym obrazie w nazwie, aby szybko znaleźć go ponownie w bazie danych, gdy już znajdziesz to, czego szukasz.

Oto proces, który wyeksportuje plik binarny do systemu plików. Zmodyfikowałem z this sample code. Jest niesprawdzona, ale powinna być bardzo bliska koncepcji. Używa BCP do eksportu twojego pliku binarnego. Sprawdź tutaj dla full docs on the BCP utility.

Proces daje także możliwość eksportu wszystkiego w tabeli lub tylko jednego wiersza na podstawie przekazanego klucza podstawowego. Używa on kursora (yuck), a także jakiegoś dynamicznego sql (fuj, yuck), ale czasami musisz zrobić to, co musisz zrobić.

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 

To wszystko oczywiście przy założeniu, że to, co jest zapisane w kolumnie obraz jest rzeczywiście obrazem, a nie jakiś inny typ pliku. Mam nadzieję, że jeśli jest to obraz, który również znać typ, BMP, JPG, PNG, GIF, itp

Jeśli nie chcesz kłopotów lub ponownego wykorzystania pełnowartościowy proc spróbować pojedynczej kwerendy tak:


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

Sprytna i dobrze przemyślana odpowiedź +1 – EBarr

+0

Dzięki za zapytanie. Do testowania wygenerowałem plik '.fmt' z informacją o każdej kolumnie mojej tabeli, a następnie próbuję' BCP SELECT MyImageField FROM (...) queryout (...) 'na jednym rekordzie, przechodząc wygenerowany plik '.fmt', ale zgłasza ten błąd:' Kolumny pliku hosta mogą być pomijane tylko podczas kopiowania na serwer'. Wiesz dlaczego? –

+0

Ten post msdn zaleca wypróbowanie wyłączenia fmtonly przed uruchomieniem - sprawdź tutaj ten sam błąd i napraw. http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/7ba623ee-8b48-44ce-ab1b-c6bf5af5a2e3/ – RThomas

4

Nie wiem w jaki sposób osiągnąć to w Management Studio. Prawdopodobnie lepiej byłoby napisać na serwerze prostą aplikację, która może wysłać zapytanie do bazy danych, a następnie przekonwertować hex na właściwy typ obrazu (.jpg, .png, itp.). Istnieją również aplikacje commercial, które zrobią to za Ciebie.

+0

Upvoting ponieważ jest to ważna odpowiedź, ale ciągle szukam rozwiązania, które nie wiąże się pisemnie lub kupują aplikacje . –

9

Typ image nie służy do przechowywania obrazów, jest to po prostu "binarne dane o zmiennej długości". Ten typ jest przestarzały i powinieneś teraz używać varbinary (max) dla danych binarnych o zmiennej długości.

Ponieważ SQL Server nie ma wiedzy o tym, jaki typ danych binarnych został zapisany (.zip, .exe, .jpg, .any), nie jest zaskakujące, że Management Studio nie zapewnia podglądu.

Zdecydowanie nie można wyświetlić podglądu tych typów danych w Managment Studio, ale podoba mi się rozwiązanie podane przez @RTomas.

+0

To mogło być pochopne - ale zobaczyłem twój wpis jako komentarz, a nie odpowiedź. ZAWSZE jest sposób na zrobienie czegoś. Nic w twoim komentarzu o typie danych lub przeszkodach w tym problemie jest technicznie niepoprawne - ale twoją jedyną odpowiedzią było CIEBIE ZROBIĆ. Myślę, że MOŻESZ wskazać tutaj dwie inne odpowiedzi. Jeśli nadal uważasz za niesprawiedliwe - odłożę to. Nie miałem na myśli obrazy. – RThomas

+0

Och, zapomniałem o innym celu. Pierwotne pytanie stwierdziło, że nie miał kontroli nad typem danych. – RThomas

+0

@Phil, podczas gdy ty nie możesz być optymistą o jasnych oczach, którego RTHomas chce, dobrze porozmawiaj o typie danych (mimo, że to nie jest to, co OP). Co więcej, prawdopodobnie w odpowiedzi na pytanie OP brzmi "jak można to zrobić w SSMS", co stawia twoją odpowiedź na miejscu. +1. – EBarr

23

Jeśli masz zainstalowaną LinqPad, podglądu zdjęć jest prosta. Zapytaj o rekord, zamień dane binarne na obraz, a następnie zrzuć dane wyjściowe do okna podglądu.

Edycja: Jeśli nie wiesz, LinqPad to darmowe narzędzie, które może być używane do wielu rzeczy, na przykład jako zamiennik dla studia zarządzania. Przez większość czasu używam go jako podkładki do scratch .Net dla programów wyrzucanych, kodu testowego i próbek.

var entity = // fetch data 

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

Oto co wynik wygląda tak:

enter image description here

+0

Ten program jest niesamowity! Właśnie wyrzuciłem moje 20000 zdjęć z bazy danych za pomocą 'System.Drawing.Image.FromStream (ms) .Zapisz (...)'. Możliwe, że zapisał strumień bezpośrednio. – SoonDead

+0

bezcenny obraz. TAK stało się tak bardzo po prostu przelewem śmieci – JJS

+3

var entity = // pobrać dane .... jak pobieranie danych z serwera sql za pomocą kodu ur? mógłbyś podać mi jakieś szczegóły? –

0

Jest naprawdę świetny dodatek dla SSMS SSMSBoost które który zapewnia wiele użytecznych funkcji i oczywiście najprostszy sposób na podgląd obrazy przechowywane w SQL (przynajmniej moim zdaniem)

UWAGA: Musisz zrestartować SSMS po zainstalowaniu tego dodatku.

zainstalować i cieszyć przeglądania obrazów tylko z: kliknij prawym przyciskiem myszy> Wizualizacja jako> Obraz

Powiązane problemy