2012-05-04 139 views
16

我有一些與image數據類型的列,我想要預覽(或瀏覽)這些表中的數據。當我在SQL Server Management Studio中使用Select top 1000 rows時,圖像列的值以十六進制顯示。由於十六進制值對我無用,因此預覽這些圖像的最簡單方法是什麼?預覽圖像列數據的最簡單方法是什麼?

PS .:數據庫不在我的控制之下,所以更改數據類型不是一個選項。

回答

14

我會寫一個進程(或查詢;見下文)二進制導出到文件系統,然後使用任何老現成的照片管理工具(即Windows照片查看器)來看看什麼是內。

如果你的聰明在你的文件命名,你可以給自己有關在名稱中的每個圖像足夠的信息來快速找到它在數據庫中,一旦你在視覺上位於您在找什麼。

這是一個將二進制文件導出到文件系統的過程。我從this sample code修改。它沒有經過測試,但應該非常接近概念。它使用BCP來導出你的二進制文件。點擊這裏查看full docs on the BCP utility

的PROC還可以導出所有的表,或僅根據所傳遞的PrimaryKey單行的能力。它使用遊標(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等圖像

如果你不想要一個完全成熟的PROC的麻煩或重用嘗試單查詢像這樣:


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 - 在此處查看相同的錯誤並修復。 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中不提供預覽。

你絕對不能預覽梟雄工作室這些數據類型,但我喜歡@RTomas給出的解決方案。

+0

它可能倉促 - 但我看到你的帖子作爲評論,而不是一個答案。總有辦法做一些事情。對於數據類型或問題障礙,您的評論中沒有任何內容在技術上是不正確的 - 但您唯一的答案就是您無法做到。我想你可以在這裏指出另外兩個答案。如果你仍然認爲不公平 - 我會放回去。我並不意味着冒犯。 – RThomas

+0

哦,忘了其他原因。原來的問題表明他無法控制數據類型。 – RThomas

+0

@Phil,雖然你可能不是明智的樂觀主義者RTHomas想要的,但你對數據類型有一個好的觀點(儘管這不是OP所要求的)。此外,可以說OP的問題是「SSMS中如何做到這一點」,這就使您的答案恰到好處。 +1。 – EBarr

23

如果您已經安裝LinqPad,預覽圖片很簡單。查詢您的記錄,將二進制數據轉換爲圖像,然後將輸出轉儲到預覽窗口。

編輯:如果你不知道,LinqPad是可以用於很多事情,如Management Studio中的替代免費的實用工具。大多數情況下,我將它用作.NET的便箋簿,用於丟棄程序,測試代碼和樣本。

var entity = // fetch data 

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

這裏的結果是什麼樣子:

enter image description here

+0

此程序非常棒!用'System.Drawing.Image.FromStream(ms).Save(...)'把我的20000張圖片從數據庫中剔除出去。也可以直接保存流。 – SoonDead

+0

無價的形象。 SO已經變得如此之多隻是垃圾溢出 – JJS

+3

var entity = //獲取數據.... 如何使用urcode從sql server中獲取數據?你能給我一些細節嗎? –

0

有一個真正偉大的附加在SSMS SSMSBoost這其中提供了大量有用的功能,當然預覽最簡單的方法存儲在SQL中的圖像(至少在我看來)

注意:安裝此加載項後,您必須重新啓動SSMS。

安裝它,享受預覽圖片只是:右擊>可視化爲>圖片

相關問題