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
Sprytna i dobrze przemyślana odpowiedź +1 – EBarr
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? –
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